为什么构造函数未通过new调用时其内部属性会全局可访问?
代码行为解释
1. 普通函数调用的this指向规则
非严格模式下,没有明确调用主体的普通函数执行时,内部this默认指向全局对象(浏览器环境为window,Node.js环境为globalThis),只有使用new关键字调用构造函数时,内部this才会指向新生成的类实例。
你执行const r = MyClass()的过程如下:
- 没有加
new直接调用MyClass,属于普通函数调用,内部this绑定为window - 执行
this.name = "Agnus"等价于给全局对象赋值:window.name = "Agnus",这就是你可以直接在全局作用域访问name属性的原因 - 函数执行后返回的匿名函数赋值给
r
2. r()的执行逻辑
直接调用r()同样属于没有调用主体的普通函数调用,内部this还是指向window,访问this.name就是读取window.name的值Agnus,自然不会报错。
补充说明
你代码中const user = new MyClass()的注释标注是错误的:构造函数如果显式返回一个非null的对象(此处是返回了匿名函数),new调用的返回值就是这个显式返回的对象,而非新生成的MyClass实例,所以user和r本质上都是同一个结构的匿名函数,调用user()同样会输出Agnus。
如果想要复现你预期的报错效果,可以在代码顶部开启严格模式:
'use strict' function MyClass() { this.name = "Agnus" return function() { console.log(this.name) } } const r = MyClass() // 直接调用时this为undefined,执行this.name会直接抛出错误
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

