Javascript область объявлений функций
Ключевое слово var
в javascript заставляет переменную храниться в локальной области. Без var
переменные относятся к глобальной области. Как насчет функций? Это ясно, что происходит, когда функции объявляются как переменные
var foo = function() {...}
но какая область
function foo() {...}
принадлежат?
EDIT:
Я понял, что не задал достаточно правильного вопроса, чтобы продолжить. Во внешнем большинстве вложенности есть разница между двумя вышеупомянутыми объявлениями и следующим объявлением?
foo = function() {...}
Ответы
Ответ 1
Он всегда относится к текущей области. Например:
// global scope
// foo is a global function
function foo() {
// bar is local to foo
function bar() {
}
}
Относительно вашего второго вопроса:
foo = function() {...}
является анонимным выражением функции, назначенным глобальной переменной (если вы не используете строгий режим, то foo
будет undefined). Разница между этим и function foo() {}
заключается в том, что последнее является объявлением функции (по сравнению с объявлением переменной, которому назначено выражение анонимной функции).
Вам может быть интересна эта замечательная статья о декларациях функций и выражениях функций: Именованные функциональные выражения, демистифицированные.
Ответ 2
Объявления функций всегда локальны для текущей области, например, переменной, объявленной с ключевым словом var
.
Однако разница заключается в том, что если они объявлены (вместо назначенной переменной), их определение будет поднято, поэтому они будут использоваться повсюду в области видимости, даже если декларация появится в конце кода. См. Также var functionName = function() {} vs function functionName() {}.
Ответ 3
Замечательное различие, учитывающее неявные глобальные значения:
var foo = function() {
// Variables
var myVar1 = 42; // Local variable
myVar2 = 69; // Implicit global (no 'var')
// Functional Expressions
var myFn1 = function() { ... } // Local
myFn2 = function() { ... } // Implicit global
function sayHi() {
// I am a function declaration. Always local.
}
}
Надеюсь, это немного разъяснит. Неявные глобальные значения определяются, если вы забудете var
перед назначением. Это опасная опасность, которая применяется к объявлениям переменных и функциональным выражениям.
Ответ 4
Ваш первый пример (var foo = function() {...}
) называется анонимной функцией. Он динамически объявляется во время выполнения и не выполняет те же правила, что и нормальная функция, но следует правилам переменных.