深刻理解:为什么.bind(this)在与new Promise一起使用时似乎不遵循正常的规则?



以下代码:

var this_module = {
    foo: 'something',
    promise: function () {
        return new Promise (function(resolve, reject) {
            resolve (this.foo);
        }.bind(this))
    }
}

成功绑定thisthis_module。我不明白为什么。

new操作符通常将this设置为作为对给定函数的构造调用的一部分而创建的对象。这意味着对Promise函数的构造调用将把this设置为Promise对象。如果是这种情况,那么.bind(this)也应该将执行器函数的this设置为Promise对象。

或者,.bind(this)应该将executor函数的this设置为Promise函数的this值(在上面的例子中应该是全局对象)。

为什么不是这样?

var this_module = {
  foo: 'something',
  promise: function () {
    return new Promise(function(resolve, reject) {
      resolve(this.foo);
    }.bind(this));
  }
};

适用this的正常规则。bind(this)中的this出现在this_modulepromise方法中,因此根据定义,它引用this_module(假设它被称为this_module.promise())。因此,它所应用的函数中的this(在本例中是执行器——作为参数传递给new Promise的函数)引用this_module,并且可以访问foo。这里没有什么令人惊讶的事。

正如在注释中解释的那样,执行器绑定的this,因此在执行器内生效,与承诺无关,也与引用新承诺的任何this无关。实际上,您无法访问正在被设计构造的承诺。任何引用新承诺的this都发生在Promise构造函数中,这对您是不可见的。

也许是由于这段代码可以很简单地解释为this的正常规则,但他们似乎有点苛刻。

你可能认为你所写的正好相当于以下内容:

var this_module = {
  foo: 'something',
  promise: function () {
    const self = this;
    return new Promise(function(resolve, reject) {
      resolve(self.foo);
    });
  }
};

,也等价于

var this_module = {
  foo: 'something',
  promise: function () {
    return new Promise((resolve, reject) =>
      resolve(this.foo);
    );
  }
};

最新更新