You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将不存在的变量作为全局对象属性返回undefined而非引用错误?

为什么访问window.b返回undefined而不是抛出引用错误?

嘿,这个问题问得特别接地气——刚入门JavaScript的小伙伴经常会在全局变量和全局对象这一块绕晕,我来给你掰扯清楚:

核心区别:变量标识符 vs 对象属性

JavaScript里这是两个完全不同的操作:

  • 当你直接写console.log(b)时,JS引擎会在当前作用域(这里是全局作用域)里找有没有声明过的变量b。如果从来没通过var/let/const声明过它,也没直接给它赋值过(比如b = 5这种隐式全局),引擎就会抛出ReferenceError——因为它找不到这个变量标识符。
  • 但当你写console.log(window.b)时,你不是在找变量,而是在访问全局对象window的一个属性。JS有个规则:不管是什么对象,只要你访问它不存在的属性,都不会报错,只会返回undefined。就像你定义一个普通对象:
    let person = {name: "张三"};
    console.log(person.height); // 输出 undefined,不会报错
    
    window本质上就是个特殊的全局对象,自然也遵循这个规则。

再补个对比例子更清楚

  • 情况1(直接访问变量):
    console.log(b); // 抛出 ReferenceError: b is not defined
    
  • 情况2(访问window的属性):
    console.log(window.b); // 输出 undefined
    

额外小知识点

如果之后你给b赋值(不管是var b = 10还是直接b = 10),这个变量就会自动成为window的属性,这时候window.b就会返回对应的值啦。

内容的提问来源于stack exchange,提问作者user12913618

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:17:36