请考虑以下代码:
foo: function() {
var self = this;
var p1 = p2 = someFunctionThatReturnsAPromise();
Promise.all([p1, p2])
.then(self.bar);
}
bar: function(promises) {
var self = this;
console.log(self);
}
输出:
undefined
但如果我改为:
foo: function() {
var self = this;
var p1 = p2 = someFunctionThatReturnsAPromise();
Promise.all([p1, p2])
.then(function(result) {
self.bar(result);
});
}
bar: function(promises) {
var self = this;
console.log(self);
}
输出:
{ foo: [Function],
bar: [Function] }
我不明白为什么第一个电话会在条形码功能中的此点发生变化。有人可以开导我吗?
答案 0 :(得分:5)
将self.bar
传递给then
方法时,会传递函数引用。虽然看起来你也指定它应该在self
对象上调用,但实际上并不是发生了什么。 self
对象不包含在该函数引用中。 this
对象的值是在调用函数时确定的,而不是在定义或作为参数传递时确定的。
在第二个示例中,self
是函数上下文中的this
对象,因为这是您从调用函数的地方。
使其工作的另一种方法是强制函数的this
对象始终为self
,从而覆盖上述行为。您可以使用.bind()
:
Promise.all([p1, p2])
.then(self.bar.bind(self));