为何将不存在的变量作为全局对象属性返回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
相关产品推荐
相关产品推荐

