Почему объявление функции JavaScript (и выражение)?
Я видел других, использующих следующий шаблон.
var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined
Но почему? Я могу понять, что оба они были объявлены, но это не так. Почему причина?
Ответы
Ответ 1
Как уже упоминалось другими, использование первой формы в вашем примере (выражение с именованной функцией) может помочь в отладке, хотя с недавними улучшениями встроенных инструментов разработчика в браузерах этот аргумент становится менее убедителен. Другая причина использования именованного выражения функции заключается в том, что вы можете использовать имя функции как переменную в теле функции, а не устаревшую в ES5 arguments.callee
.
Однако названные функциональные выражения неверно и проблемно реализованы в Internet Explorer < 9 и, как правило, следует избегать, когда вы ориентируетесь на эти браузеры. Подробнее см. Юрий Зайцев за отличную статью по теме.
Ответ 2
При отладке приложения легче узнать, что вызывает то, что в стеке вызовов, когда используются "именованные" анонимные функции. Таким образом, это способ дать имя анонимной функции для целей отладки.
Попробуйте это и посмотрите на столбец в отладчике:
myDiv = document.getElementById("myDiv");
myDiv.onclick = function OnClick(){
debugger;
//do something
}
Ответ 3
Они называют анонимную функцию, потому что она облегчает отладку. При отладке вы увидите вызов "foo" в стеке вызовов, а не кучу вызовов на "анонимный".
Ответ 4
Единственная причина, по которой я могу себе представить, - дать функции нужное имя. Это помогает отлаживать, поскольку инспектор использует атрибут object object name
. Попробуйте следующее:
var bar = function foo(){};
console.log(bar.name); // foo
Если вы поместите некоторый реальный код внутри foo и добавьте точку останова в отладчик JavaScript в вашем браузере, вы увидите функцию как foo
в стеке вызовов.
Ответ 5
Определение функции (или литерал) имеет 4 части. 1. Зарезервированное слово function
2. Необязательное имя, которое может использоваться отладчиками или функцией, чтобы вызвать себя рекурсивно. 3. Параметры и 4. Тело функции, завернутое в { }
Вне области возможностей foo не существует. Но так как вы назначили функцию на переменную панель, вы можете вызвать ее с помощью панели вызова метода, и поскольку bar определен, вы можете ее распечатать.
Если вас интересует JavaScript, вам стоит подумать о том, чтобы получить книгу Дугласа Крокфорда Javascript: Хорошие части