Ошибка глобальной ссылки Javascript [дубликат]


На этот вопрос уже есть ответ здесь:

Я получил этот вопрос в интервью, и мне любопытно, почему эти два вывода разные вещи:

(function() {
    console.log(bar);
    console.log(baz);
    foo();

    function foo() {
        console.log('aloha');
    }

    var bar = 2;
    baz = 3;
})();

Ouputs:

undefined
Uncaught ReferenceError: baz is not defined 

Тогда как:

(function() {
    console.log(bar);
    console.log(window.baz);
    foo();

    function foo() {
        console.log('aloha');
    }

    var bar = 2;
    baz = 3;
})();

Выходы:

undefined
undefined
'aloha'

В чем разница в том, что baz и window.baz ссылаются? Я думал, что глобалы автоматически прикреплялись к окну?

3 2

3 ответа:

A ReferenceError указывает, что обнаружено недопустимое значение ссылки (ECMA 5 15.11.6.3)

На практике это означает, что при попытке JavaScript получить значение неразрешимой ошибки будет брошена ссылка ссылка. (Есть и другие случаи, когда ReferenceError будет бросается, особенно при работе в строгом режиме ECMA 5. Если вы заинтересованные проверяют список чтения в конце этой статьи)

Для дальнейшего чтения взгляните здесь .

Это происходит потому, что console.log(window.baz); пытается найти переменную внутри объекта window, где as console.log(baz) пытается получить автономную переменную, которая еще не определена.

Поскольку определения функций вычисляются перед выполнением, выражения присвоения переменных не вычисляются.