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

Вы всегда можете превратить функцию либо в установщик (присваивая какое-либо значение свойству объекта контекста), либо в функцию в определении слова старой школы (т. Е. Фрагмент кода, который фактически возвращает какое-то значимое значение).

Другие вопросы по тегам