为何new调用obj2.foo绑定函数时this指向空对象?
问题解答
要搞懂这两种调用的差异,核心得先明确两个关键点:
bind生成的绑定函数,被new操作符调用时,绑定的this会被忽略,new会创建一个全新的空对象作为函数内的this。- 构造函数(用
new调用的函数)如果返回了一个对象类型的值,那么new的结果就是这个返回的对象,而不是默认创建的实例。
拆解new obj2.foo()的执行过程
- 首先,
obj2.foo是bar()执行后返回的foo.bind(obj1),也就是一个预先绑定了obj1的foo函数。 - 当用
new调用这个绑定函数时,按照bind的规则,之前绑定的obj1直接失效,new会自动创建一个空对象作为foo内部的this,所以最终输出foo {}。
拆解new bar()()的执行过程
- 第一步执行
new bar():bar是普通函数,用new调用时,原本会创建一个bar的实例对象,但bar函数的返回值是foo.bind(obj1)(一个对象类型的绑定函数),所以new bar()的结果就是这个绑定函数,而不是默认的bar实例。 - 第二步调用这个绑定函数的
():这是普通调用绑定函数,bind绑定的obj1会生效,所以foo内部的this指向obj1,最终输出foo { a: 1 }。
内容的提问来源于stack exchange,提问作者jimkk159
相关产品推荐
相关产品推荐

