var gameOfLife = function() { }
- это выражение функции , тогда как
function gameOfLife() { }
- это объявление функции .
Цитировать Юрия 'kangax'Зайцев о Выражения функций и объявления функций :
В поведении объявлений и выражений есть небольшая разница.
Прежде всего, объявления функций анализируются иоценивается, прежде чем любые другие выражения.Даже если объявление расположено последним в источнике, оно будет оцениваться , прежде всего любые другие выражения , содержащиеся в области видимости.[…]
Другая важная особенность объявлений функций заключается в том, что их условное объявление не стандартизировано и варьируется в зависимости от среды.Вы никогда не должны полагаться на то, что функции объявляются условно, и вместо них следует использовать выражения функций.
В этом случае, как упоминает Джоэль Коухорн в комментарии, gameOfLife
определяется условно, поэтому необходимо использовать функциюexpression.
Общий вариант использования этих условно определенных функций заключается в расширении функциональности JavaScript в браузерах, которые не имеют встроенной поддержки новых функций (недоступно в предыдущих версиях ECMAScript / JavaScript).Вы не хотите делать это с помощью объявлений функций, так как они все равно перезаписывают встроенную функциональность, что, скорее всего, не то, что вы хотите (учитывая скорость и т. Д.).Краткий пример этого:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item, from) {
/* implement Array.indexOf functionality,
but only if there's no native support */
}
}
Одним из основных недостатков выражений функций является то, что вы фактически назначаете анонимную функцию переменной.Это может усложнить отладку , так как имя функции обычно не известно, когда выполнение скрипта останавливается (например, на заданной вами точке останова).Некоторые JavaScript-отладчики, такие как Firebug, пытаются дать имя переменной, которой была назначена функция, но поскольку отладчик должен угадать это, анализируя содержимое скрипта на лету, это может быть слишком сложно (что приводит к(?)()
отображается вместо названия функции) или даже ошибается.
(например, читайте на странице, хотя ее содержание не совсем подходит для начинающих)