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对象中查找变量,其中asconsole.log(baz)
正在尝试获取尚未定义的独立变量
ReferenceError表示检测到无效的参考值(ECMA 5 15.11.6.3)
实际上,这意味着当JavaScript试图获取无法解决的问题的值时,将抛出ReferenceError
参考资料。(在其他情况下,会出现引用错误
抛出,尤其是在ECMA5严格模式下运行时
感兴趣的读者(查看本文末尾的阅读列表)
进一步阅读请看。那么,为什么loggin
bar
不会抛出错误呢?bar不会产生错误,因为Javascripts的存在。我相信编译器在执行之前也会记录var def,但是不会指定值。我认为真正的问题是为什么日志bar
不会抛出错误。至少我对此很好奇。当你的问题只是关于baz
和window.baz
之间的区别时,你为什么要发布所有其他代码?因为我被逐字逐句地问到了这一点。我想我本可以去掉其他的东西。面试官试图通过扔一些不相关的垃圾来迷惑你,让你难堪。你的目标应该正好相反。谢谢你的链接。这就是我想要的那种深入的解释。