javascript, возвращающий функциональные выражения против объявления переменных внутри функции
Возьмите следующую функцию:
function createGlobalVar() {
y = "foo";
}
y //"foo"
в отсутствие ключевого слова var, которое делает ya локальной переменной, функция поднимается по цепочке областей видимости, чтобы попытаться найти, где существует y. Без какого-либо существующего объявления он создает y как глобальную переменную. Таким образом, мне не нужно добавлять return y в конце моей функции, чтобы y существовал вне ее.
Теперь, если я попытаюсь сделать то же самое, но назначить выражение функции для y, это не сработает.
function createGlobalVar() {
y = function() { alert("foo!") }
}
y //"undefined"
Я знаю, как исправить это, чтобы оно заработало:
function createGlobalVar() {
y = function() { alert("foo!") }
return y;
}
var x = createGlobalVar();
x // function() { alert("foo!") }
Но я не понимаю, ПОЧЕМУ мне нужно возвращать глобальную переменную только потому, что ей было назначено функциональное выражение. Чем отличается?
1 ответ
Ты забыл позвонить createGlobalVar
в вашем втором примере. Нет разницы между назначением функции или нефункционального выражения свойству глобального объекта - и это то, что происходит, когда вы пишете это так, как вы это делали.
Обратите внимание, что использование такого глобального объекта (если у вас нет веских причин) не рекомендуется. Если бы вы написали эту функцию при включенном строгом режиме, она бы вызвала ReferenceError на строку с y
:
function createGlobalVar() {
'use strict';
y = function() { alert("foo!") };
}
createGlobalVar();
>> ReferenceError: y is not defined
Вы всегда можете превратить функцию либо в установщик (присваивая какое-либо значение свойству объекта контекста), либо в функцию в определении слова старой школы (т. Е. Фрагмент кода, который фактически возвращает какое-то значимое значение).