Javascript:承诺+这个

时间:2016-05-19 21:25:25

标签: javascript promise this

请考虑以下代码:

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] }

我不明白为什么第一个电话会在条形码功能中的点发生变化。有人可以开导我吗?

1 个答案:

答案 0 :(得分:5)

self.bar传递给then方法时,会传递函数引用。虽然看起来你也指定它应该在self对象上调用,但实际上并不是发生了什么。 self对象不包含在该函数引用中。 this对象的值是在调用函数时确定的,而不是在定义或作为参数传递时确定的。

在第二个示例中,self 函数上下文中的this对象,因为这是您从调用函数的地方。

使其工作的另一种方法是强制函数的this对象始终为self,从而覆盖上述行为。您可以使用.bind()

实现这一目标
Promise.all([p1, p2])
    .then(self.bar.bind(self));