Javascript 深刻理解:为什么.bind(这个)在与新Promise一起使用时似乎不遵循正常规则
以下代码:Javascript 深刻理解:为什么.bind(这个)在与新Promise一起使用时似乎不遵循正常规则,javascript,this,es6-promise,Javascript,This,Es6 Promise,以下代码: var this_module = { foo: 'something', promise: function () { return new Promise (function(resolve, reject) { resolve (this.foo); }.bind(this)) } } 成功地将此绑定到此\u模块。我不明白为什么 new操作符通常将this设置为作为给定函数构造调用的一部分
var this_module = {
foo: 'something',
promise: function () {
return new Promise (function(resolve, reject) {
resolve (this.foo);
}.bind(this))
}
}
成功地将此
绑定到此\u模块
。我不明白为什么
new
操作符通常将this
设置为作为给定函数构造调用的一部分而创建的对象。这意味着对Promise函数的构造调用将This
设置为Promise对象。如果是这种情况,则.bind(this)
还应将executor函数的this
设置为Promise对象
或者,.bind(this)
应将执行器函数的this
设置为Promise函数的this
值(在上述示例中,该值应为全局对象)
为什么不是这样
var this_module = {
foo: 'something',
promise: function () {
return new Promise(function(resolve, reject) {
resolve(this.foo);
}.bind(this));
}
};
此的正常规则适用。bind(this)
中的this
出现在this\u module
上的方法promise
中,因此根据定义,它指的是此\u module
(假设它被称为this\u module.promise()
)。因此,应用它的函数中的this
(在这种情况下,执行器——作为参数传递给new Promise
的函数)引用此模块,并且可以访问foo
。这里没有发生令人惊讶的事情
如注释中所述,执行人受约束的本
,因此在执行人内部有效,与承诺或提及新承诺的任何本
无关。事实上,您无法通过设计访问正在构建的承诺。任何引用新承诺的此
都发生在承诺
构造函数中,您看不见该构造函数
也许否决票是因为这个代码可以很简单地用这个
的正常规则来解释,但它们看起来确实有点苛刻
你可以认为你所写的与下面的内容相当:
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);
);
}
};
new
操作符与传递给Promise
的函数无关。您是在Promise
上调用new
,而不是在传递给Promise
的函数上调用。“如果是这种情况,则.bind(this)
还应将执行器函数的this
设置为承诺对象。”在调用.bind(this)
时,承诺对象不存在此
指的是此
所指的内部promise:function(){}
。我很困惑,您是否认为它应该是除此模块之外的其他东西。它完全遵循“正常”规则。如果您有var handler=function(resolve,reject){…}.bind(this),那么您也会感到困惑;返回新承诺(经办人)那么为什么这个
不引用Promise函数中的全局对象呢?我假设你指的是当你说“Promise函数”时传递给Promise
的回调?此
引用的内容取决于promise:function(){…}
中此
引用的内容。如果将函数调用为this_module.promise()
,this
指的是this_module
。如果您执行var p=此_模块;p()代码>,此
指的是全局对象。如果您执行此\u模块.promise.call(foobar)
,此
指的是foobar
。这些是“正常的”规则,这里没有什么特别的事情发生。谢谢@Felix Kling。我会试着把我的头绕在它周围。