Javascript全局参考错误

时间:2014-03-07 07:46:59

标签: javascript window global-variables hoisting

我在接受采访时得到了这个问题,我很好奇为什么这两个输出不同的东西:

(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'

引用bazwindow.baz的方式有何不同?我虽然全局自动附加到窗口?

3 个答案:

答案 0 :(得分:1)

  

ReferenceError表示检测到无效参考值(ECMA 5 15.11.6.3)

     

实际上,这意味着当JavaScript试图获取无法解析的值时,将抛出ReferenceError   参考。 (还有其他情况会出现ReferenceError   抛出,最值得注意的是在ECMA 5 Strict模式下运行时。如果你是   有兴趣查看本文末尾的阅读清单)

如需进一步阅读,请查看here

答案 1 :(得分:0)

因为函数定义在执行之前被计算,所以变量赋值表达式不是。

答案 2 :(得分:0)

这是因为console.log(window.baz);正在尝试在窗口对象中找到变量,而console.log(baz)正试图获取一个尚未定义的独立变量。