Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 深刻理解:为什么.bind(这个)在与新Promise一起使用时似乎不遵循正常规则_Javascript_This_Es6 Promise - Fatal编程技术网

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。我会试着把我的头绕在它周围。