为什么全局上下文下执行console.log(this.a)时let声明的a返回undefined
问题现象原因
核心原因是var和let的全局声明绑定规则存在本质差异:
- 使用
var在全局上下文声明变量时,会同时将变量作为属性挂载到全局对象(浏览器环境为window,Node.js环境为globalThis)上。而全局上下文里的this默认指向全局对象,因此this.b可以直接访问到挂载的属性值6。 - ES6 新增的
let/const/class等声明方式,在全局上下文声明的变量只会存储在全局作用域的声明环境记录中,不会被挂载到全局对象上。因此全局对象上不存在a属性,通过this.a访问自然返回undefined。
补充验证:直接在全局上下文执行
console.log(a)可以正常输出5,说明变量a确实存在于全局作用域中,只是没有绑定到全局对象上而已。这个设计是ES6特意做的区分,目的是避免全局变量意外覆盖全局对象的原生属性,减少全局命名冲突的风险。
内容的提问来源于stack exchange,提问作者Samruddh Shah
相关产品推荐
相关产品推荐

