Если вы еще не сделали, я настоятельно предлагаю читать удивительную статью Named function expressions demystified, из которого я собираюсь процитировать через ответ.
Одним из двух наиболее распространенных способов создания функционального объекта в ECMAScript является либо выражение Function, либо Function Declaration. Разница между двумя довольно запутанна. По крайней мере, это было для меня.Единственное ECMA спецификации ясно, что функция Декларация должна всегда иметь идентификатор (или имя функции, если вы предпочитаете), и функция Выражение может опустить его:
FunctionDeclaration:
функция Identifier (опц) {FunctionBody }
ВыражениеФункции:
функции Идентификатор опц (опц) {} FunctionBody
Ваша первая функция получила объявлена, используя объявление функции
function flytothemoon() {
alert("Zoom")
}
Прежде всего, объявления функций анализируются и оцениваются прежде, чем любые другие выражения. Даже если объявление позиционируется последним в источнике, оно будет оцениваться прежде всего любыми другими выражениями, содержащимися в области.
Итак, ничего особенного. Обычно объявленная функция, которая может быть вызвана, с использованием идентификатора функций flytothemoon
, за которым следуют парсеры ()
.
Ваша вторая функция немного отличается, как таковая, что она является выражением функции.
Мы можем видеть, что когда идентификатор опущен, это «что-то» может быть только выражением.
Что происходит во втором случае?
Чтобы упростить понимание, функции, являются членами первого класса в JavaScript, в конце концов, это просто объекты, которые могут быть назначены переменной.
var flytothesun = function(){
alert("Fly to the Sun");
}
- Новая переменная
flytothesun
получает объявлена.
- Затем вычисляется выражение, инициализирующее переменную.
- Результатом выражения является ссылкой на анонимные функции
- Это задание, а затем получает назначение в вашей переменной
flytothesun
Помните, что функции которые вызываются круглые скобки ()
?. Ничто не происходит в строке
flytothesun();
Вы просто вызов функции, которые ваша переменная flytothesun
ссылки.
Как уже упоминалось в комментариях, вы также можете назвать функциональные выражения, назначение и преимущества которых хорошо описаны в статье.
Если вы заинтересованы, читать;)
Как это не напрямую обратиться точкой в этом вопросе, я добавлю два минимальных (возможно, не то, что практические) примеров, только.
- 1. Рекурсия. Ссылка на функцию доступна через ее идентификатор внутри функции.
var sixthParent = (function parent (el,n) { return n?parent (el.parentElement,--n):el})(someChildElement,6);
Как вы видите, мы можем использовать именованные функции выражения, используя идентификатор, чтобы получить наши элементы, родителю рекурсивно
var results = [];
someAjaxReqeust (function callback (response) {
results.push (response.data);
if (response.has_more) {
someAjaxRequest (callback);
} else {
console.log (results);
}
});
В данном случае используется идентификатор чтобы передать функции обратного вызова ссылке на наш ajaxhandler, чтобы сделать успешный вызов ajax, если ответ указывает, что есть больше данных.
- 2. Отладка. Опциональный идентификатор выражения функций будет включен в stacktrace в случае ошибок, что помогает нам в отладке. Без имени мы получим
<anonymous>
например
try {
(function debug() {
throw new Error("dummy")
})()
} catch (e) {
console.log(e.stack)
}
/*
Error: dummy
at debug (<anonymous>:4:15)
at <anonymous>:5:7
at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
at Object.InjectedScript.evaluate (<anonymous>:459:21)
/*
Там нет анонимной функции здесь. Вы определили именованную функцию, а также вызвали ее! – adarshr
Линия 'flytothesun();' очень выделяется ... –
... ну что бы вы ожидали? – Doorknob