Почему объявление функции 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: Хорошие части