为什么我必须绑定此函数参数?

时间:2015-01-25 16:31:07

标签: javascript

// 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.saveexample A引用是正确的,而在example B中却没有?

我可以使用this强制bind更正,但example A中与example B不同的是什么?

我不明白为什么this会有所不同。

2 个答案:

答案 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方法以解决这些用例。