Javascript全局引用错误

Javascript全局引用错误,javascript,window,global-variables,hoisting,Javascript,Window,Global Variables,Hoisting,我在一次采访中得到了这个问题,我很好奇为什么这两个输出不同的东西: (function() { console.log(bar); console.log(baz); foo(); function foo() { console.log('aloha'); } var bar = 2; baz = 3; })(); 输出: undefined Uncaught ReferenceError: baz is not d

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

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

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

    var bar = 2;
    baz = 3;
})();
输出:

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
的方式有什么区别?虽然全局变量自动附加到了window?

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

这是因为
console.log(window.baz)
正在尝试在window对象中查找变量,其中as
console.log(baz)
正在尝试获取尚未定义的独立变量

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

实际上,这意味着当JavaScript试图获取无法解决的问题的值时,将抛出ReferenceError 参考资料。(在其他情况下,会出现引用错误 抛出,尤其是在ECMA5严格模式下运行时 感兴趣的读者(查看本文末尾的阅读列表)


进一步阅读请看。

那么,为什么loggin
bar
不会抛出错误呢?bar不会产生错误,因为Javascripts的存在。我相信编译器在执行之前也会记录var def,但是不会指定值。我认为真正的问题是为什么日志
bar
不会抛出错误。至少我对此很好奇。当你的问题只是关于
baz
window.baz
之间的区别时,你为什么要发布所有其他代码?因为我被逐字逐句地问到了这一点。我想我本可以去掉其他的东西。面试官试图通过扔一些不相关的垃圾来迷惑你,让你难堪。你的目标应该正好相反。谢谢你的链接。这就是我想要的那种深入的解释。