以下代码:
var this_module = {
foo: 'something',
promise: function () {
return new Promise (function(resolve, reject) {
resolve (this.foo);
}.bind(this))
}
}
成功绑定this
和this_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_module
的promise
方法中,因此根据定义,它引用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);
);
}
};