15

考虑以下代码:

foo:function(){var self=此;变量p1=p2=someFunctionThatReturnsAPromise();全部承诺([p1,p2]).then(self.bar);}bar:功能(承诺){var self=此;console.log(self);}

输出:

未定义

但如果我改为执行以下操作:

foo:function(){var self=此;变量p1=p2=someFunctionThatReturnsAPromise();全部承诺([p1,p2]).then(函数(结果){self.bar(结果);});}bar:功能(承诺){var self=此;console.log(self);}

输出:

{foo:[函数],bar:[功能]}

我不明白为什么第一个电话会改变位置bar函数中的点。有人能启发我吗?

1答案1

重置为默认值
11

当你经过自拍棒然后方法,则传递函数引用。虽然看起来您也指定了应该在自己对象,这实际上不是正在发生的事情。这个自己对象不包含在该函数引用中。这个对象的值是在调用函数时确定的,而不是在将其定义为参数或作为参数传递时确定的。

在第二个示例中,自己 这个对象,因为这是您呼叫来自的函数。

另一种使其工作的方法是强制函数对象始终为自己,覆盖上述行为。你可以用.bind():

全部承诺([p1,p2]).then(self.bar.bind(self));

不是你想要的答案吗?浏览标记的其他问题问自己的问题.