【问题标题】:Javascript Global Reference Error [duplicate]Javascript全局参考错误[重复]
【发布时间】:2023-04-08 04:02:01
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为真正的问题是为什么记录 bar 不会引发错误。至少我对此很好奇。
  • 当您的问题只是关于bazwindow.baz 之间的区别时,为什么还需要发布所有其他代码?
  • 因为这就是我被逐字询问的内容。我想我可以删除其他的东西。
  • 面试官试图通过扔一些不相关的垃圾来迷惑你,让你很难受。当你问 SO 时,你的目标应该是完全相反的。

标签: javascript window global-variables hoisting


【解决方案1】:

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

【讨论】:

  • 那么,为什么登录bar 不会抛出错误?
  • bar 不会因为Javascripts 提升原理而报错
  • 我相信编译器在执行之前也会记录 var defs,但是值的分配不是。这将解释所有的行为。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的链接。这就是我正在寻找的那种深入的解释。
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2010-11-25
    • 2012-06-13
    相关资源
    最近更新 更多