Подтвердить что ты не робот

Анонимная функция против нормальной функции

Просто из интереса, существуют ли различия в скорости и функциональности между

function foo(bar) {
    alert("foo" + bar);
}

и

var foo = function(bar) {
    alert("foo" + bar);
};
4b9b3361

Ответ 1

Нет существенных различий в скорости. (Тест)

Существуют различия в функциональности.

  • Объявления функций (например, ваши первые) и выражения функций (например, ваша вторая) обрабатываются в разное время.
  • Они оказывают различное влияние на область, в которой они происходят.
  • Ваша первая функция имеет истинное имя, ваша вторая не в ES5 и ранее, ваша вторая не делает; в ES6/ES2015 это происходит, потому что в спецификации указано, что движок JavaScript должен назначить имя переменной функции в этом случае.

Если вы посмотрите на "объявление функции" и "выражение функции", вы найдете много разговора (некоторые из них даже правильные) в теме.

Но кратко:

Объявление функции

Объявление функции, подобное вашему первому примеру, происходит, когда курсор выполнения входит в свою содержащую область (содержащую функцию или глобальную область) до того, как будет выполнен пошаговый код. Поэтому они не могут появляться в нефункциональных блоках (if, try и т.д.), Так как поэтапный код не запускается при их обработке. Имя функции добавляется в область, в которой она появляется, а объект функции имеет истинное имя (хотя стандартного способа запроса этого имени нет, он по-прежнему полезен для стеков и т.д.). (Примечание: некоторые JavaScript-движки допускают объявления функций внутри блоков, но недействительные, и то, что они делают, не обязательно согласовано. Не делайте этого.)

Выражение анонимных функций

Выражение функции, подобное вашему второму примеру, происходит, как и все выражения, когда оно встречается в пошаговом потоке кода. Ваше выражение называется анонимным выражением функции, поскольку оно явно не указывает имя функции. В ES5 и ранее это означало, что результирующая функция не имела имени. В ES6/ES2015 и более поздних версиях многие функции, созданные с помощью анонимных выражений функций, имеют имена, поскольку имя может быть выведено из выражения, а случай с вашим примером, в котором функция заканчивается именем, которое имеет переменная: foo. Поскольку выражения анонимной функции являются выражениями, они могут встречаться везде, где могут возникать выражения, хотя иногда вам приходится предупреждать парсер о том, что вы делаете.

Именованная функция

Есть третий способ сделать это: выражение с именованной функцией, а не анонимное. Они выглядят так:

var foo = function bar() {
};

или

var obj = {
    foo: function bar() {
    }
};

или

doSomething(function bar() { });

и др.

Раньше они были действительно проблемным кросс-браузером (например, IE8 и более ранние ) версии Safari имели проблемы и т.д. Kangax хорошая страница о проблемах, которые были изобилуют). Это выражение, поэтому оно действительно где-нибудь есть выражение. Имя функции (bar в моем примере) не добавлено в область содержимого с помощью совместимого механизма JavaScript.