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

构造函数返回的箭头函数是否持有其作用域内this关键词的闭包?

问题1解答

person()和foo()输出差异的核心原因是普通函数的this在调用时确定,箭头函数的this在定义时捕获外层作用域的this,两者结合的结果:

  • 执行const person = new Person()时,按照new运算符的规则,Person构造函数内部的this会被绑定到新创建的Person实例对象。此时定义的箭头函数bar会直接捕获当前Person作用域的this(也就是实例对象),后续调用person()时直接用这个捕获的this,所以输出Person对象。
  • 执行const foo = Person()时,属于非严格模式下的普通函数直接调用,Person内部的this默认绑定到Window对象。此时定义的bar捕获的就是Window作为this,后续调用foo()自然输出Window。

问题2解答

你的猜测完全正确:bar确实持有Person作用域内this的闭包,对应的this绑定的对象不会被销毁。

很多人会误以为this是特殊关键字不会被闭包捕获,实际上ES6规范中箭头函数没有独立的this绑定,它的this和普通变量的查找规则完全一致:从外层词法环境逐级向上查找。既然你示例中的x会被闭包捕获保留,this作为外层词法环境中的绑定,也一样会被bar的闭包持有,只要bar没有被销毁,对应的this指向的对象就不会被垃圾回收。

2.1 解答

不存在“bar没有持有this闭包”的情况,bar在Person内部定义的时候,就已经把当前作用域的this捕获到自己的闭包环境中存储了,后续调用person()时直接从闭包中读取即可,不需要再动态查找this。

2.2 解答

正是因为this被bar的闭包存储了,哪怕Person已经执行完成出栈,闭包保留的词法环境依然存在,所以console.log(this)才能拿到new创建的Person实例对象。


补充说明:如果在严格模式下执行const foo = Person(),Person内部的this会是undefined,此时foo()输出的也会是undefined,和非严格模式的表现有差异。

内容的提问来源于stack exchange,提问作者ba chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 08:15:06