// example A (works)
foo(function() {
myObj.save();
});
// example B (doesn't work)
foo(myObj.save);
// example C (works)
foo(myObj.save.bind(myObj));
为什么在this
中调用myObj.save
时example A
引用是正确的,而在example B
中却没有?
我可以使用this
强制bind
更正,但example A
中与example B
不同的是什么?
我不明白为什么this
会有所不同。
答案 0 :(得分:2)
函数在调用时只有一个上下文this
。
当您致电x.y()
时,this
内的y
上下文为x
。
当你写x.y
时,你只引用了函数y
,你没有调用它,也没有上下文。当您将该函数传递到其他位置时,例如z = x.y
,上下文不会随之传递。
你在第二个例子中这样做了。您已将函数无上下文传递到foo
,其中foo
无法知道上下文应该是什么。当foo
调用它时,将调用一个简单的save()
调用,当发生这种情况时,this
上下文将为window
(或严格模式下null
)。
答案 1 :(得分:1)
这是因为this
指的是调用方法的对象。当您将函数的方法设置为变量或将其作为参数传递时,它不再与作为方法的对象相关联。
多个对象可以共享同一个函数,this
是一种动态重用该函数来操纵对象实例的方法。
稍后添加bind
方法以解决这些用例。