Итак, прежде всего, мы должны прояснить основное различие между двумя написанными вами функциями.
Это одно:
var aFunc = function(){};
является функцией выражение а. Где это:
function bFunc(){};
является функция объявления а.
В выражении функции вы используете function operator для определения функции внутри выражения. Когда вы , объявляете функцию, вы используете function statement.
В начале это может сбивать с толку, потому что они действительно похожи, однако выражение функции и выражение функции ведут себя по-разному. Прежде всего, вы не можете объявить анонимную функцию: если вы используете оператор функции, это имя является обязательным. Так только функция, определенная с оператором функцией может быть анонимными:
var aFunc = function(){};
Это анонимная функции. В некоторых браузерах вы можете распечатать function's name и посмотреть сами:
console.log(aFunc.name);
(Обратите внимание, что это не стандарт еще, но есть proposal)
Но это не означает, что функции объявлены с оператор функции должен быть анонимным. Например:
var aFunc = function myFunction() {};
Это именованная функция. Тем не менее, это все еще отличается от объявления такой функции:
function myFunction() {};
var aFunc = myFunction;
Почему? Потому что в случае выражения функции, вы не объявляете myFunction
функции в сфере:
var aFunc = function myFunction() {};
console.log(typeof myFunction) // undefined, unless some bugs
Так что точка, чтобы дать имя выражения функции? Ответ: иметь доступ к этой функции из самого тела функции, не загрязняя область действия.Обработки изображений, например, вы хотите добавить прослушиватель событий в узел DOM, но выполнить слушателя только один раз:
document.body.addEventListener("click", function onclick() {
// do something
document.body.removeEventListener("click", onclick, false);
}, false);
Таким образом, вы не загрязняют сферу с большим количеством функций, которые используются только для целей, как, что и вы все равно можете получить доступ к функции из тела функции. Это особенно полезно в ES5, где arguments.callee
устарел и для рекурсии.
Еще одно отличие выражения функции заключается в том, что вы можете вызывать их немедленно, но вы не можете сделать это для объявления функции. Так, например:
function() {
console.log('foo');
}();
будет сгенерировано исключение, потому что двигатель не может понять, если это объявление функции или выражение функции. Но если заставить двигатель смотреть на него как выражение:
!function() {
console.log('foo');
}();
// or
(function(){
console.log('foo');
}());
// etc, there are a lot of ways
Здесь мы: JS понять это выражение, поэтому угрозы в function
как оператор, а не как заявление. И вы получаете IIFE (Expression Exposed Function Expression), которые полезны во многих сценариях, особенно там, где вы хотите изолировать код.
Итак, вернемся к вам вопрос, почему имя этой функции:
var aFunc = function(){};
не aFunc
?
Потому что это выражение. Значит, значение ничего не знает о назначении слева. Это как:
var aFunc = -3;
Если -
является Unary Negation operation и 3
это значение: они ничего не знает о aFunc
, верно? Точно так же с выражение функции, где function
- оператор, а (){}
- значение.
'function() {}' - анонимная функция, а 'aFunc' - нет. –