构造函数返回的箭头函数是否持有其作用域内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
相关产品推荐
相关产品推荐

