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

为什么构造函数未通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:18:03