为何未定义的变量作为全局对象属性访问时返回undefined而非报错
解答
该差异是JavaScript内置的语法规则决定的,两种写法属于完全不同的执行逻辑:
- 直接写
console.log(apple)属于标识符解析逻辑:JS引擎会从当前作用域开始,沿着作用域链向上查找apple的声明,遍历到全局作用域仍找不到对应声明时,就会按照规范抛出ReferenceError。 - 写
console.log(global.apple)属于对象属性访问逻辑:global是JS运行环境提供的全局对象,访问任意对象不存在的属性时,JS规范都定义为返回undefined,不会抛出错误,该规则对全局对象和普通对象完全一致。你可以用普通对象做验证:
你没有声明过const emptyObj = {} console.log(emptyObj.apple) // 输出undefined,无报错apple变量,全局对象上自然不存在apple属性,因此返回undefined是符合预期的结果。
关联补充
如果你用var在全局作用域声明变量,变量会自动挂载到全局对象上,此时global.apple会返回对应的值;如果用let/const在全局作用域声明变量,变量不会挂载到全局对象上,global.apple仍然会返回undefined。
学习资料推荐
你可以参考以下经典教材的对应章节深入学习底层原理:
- 《JavaScript高级程序设计(第4版)》:变量、作用域与内存、对象基础章节
- 《你不知道的JavaScript(上卷)》:作用域与闭包、this与对象原型章节
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

