Просто из интереса, существуют ли различия в скорости и функциональности между
function foo(bar) {
alert("foo" + bar);
}
и
var foo = function(bar) {
alert("foo" + bar);
};
Просто из интереса, существуют ли различия в скорости и функциональности между
function foo(bar) {
alert("foo" + bar);
}
и
var foo = function(bar) {
alert("foo" + bar);
};
Нет существенных различий в скорости. (Тест)
Существуют различия в функциональности.
Если вы посмотрите на "объявление функции" и "выражение функции", вы найдете много разговора (некоторые из них даже правильные) в теме.
Но кратко:
Объявление функции, подобное вашему первому примеру, происходит, когда курсор выполнения входит в свою содержащую область (содержащую функцию или глобальную область) до того, как будет выполнен пошаговый код. Поэтому они не могут появляться в нефункциональных блоках (if
, try
и т.д.), Так как поэтапный код не запускается при их обработке. Имя функции добавляется в область, в которой она появляется, а объект функции имеет истинное имя (хотя стандартного способа запроса этого имени нет, он по-прежнему полезен для стеков и т.д.). (Примечание: некоторые JavaScript-движки допускают объявления функций внутри блоков, но недействительные, и то, что они делают, не обязательно согласовано. Не делайте этого.)
Выражение функции, подобное вашему второму примеру, происходит, как и все выражения, когда оно встречается в пошаговом потоке кода. Ваше выражение называется анонимным выражением функции, поскольку оно явно не указывает имя функции. В ES5 и ранее это означало, что результирующая функция не имела имени. В ES6/ES2015 и более поздних версиях многие функции, созданные с помощью анонимных выражений функций, имеют имена, поскольку имя может быть выведено из выражения, а случай с вашим примером, в котором функция заканчивается именем, которое имеет переменная: foo
. Поскольку выражения анонимной функции являются выражениями, они могут встречаться везде, где могут возникать выражения, хотя иногда вам приходится предупреждать парсер о том, что вы делаете.
Есть третий способ сделать это: выражение с именованной функцией, а не анонимное. Они выглядят так:
var foo = function bar() {
};
или
var obj = {
foo: function bar() {
}
};
или
doSomething(function bar() { });
и др.
Раньше они были действительно проблемным кросс-браузером (например, IE8 и более ранние ) версии Safari имели проблемы и т.д. Kangax хорошая страница о проблемах, которые были изобилуют). Это выражение, поэтому оно действительно где-нибудь есть выражение. Имя функции (bar
в моем примере) не добавлено в область содержимого с помощью совместимого механизма JavaScript.