对象方法中的“this”变量是.then()调用时的全局对象

时间:2017-09-15 20:10:36

标签: javascript javascript-objects

我是承诺的新手但我的理解是.then()的参数是2个函数(可选)来处理onfulfilled和onreject。这些函数可以返回值,承诺或抛出错误。

我还看到了履行函数是其他地方定义的函数的示例,例如:

function onFulfill(){...}
promise.then(onFulfill)

我试图有一个自定义对象,它有一些函数,可以是这些onFulfill等函数,参见下面的例子。

function Test() {
    this.value = "something"
}

Test.prototype.makePromise = function() {
    console.log(this)
    return Promise.resolve();
};

Test.prototype.test = function() {
    console.log(this)
};

var T = new Test();

T.test()

var P = Promise.resolve().then(T.makePromise)

我的问题出现了,因为当我打电话给T.test()时,印刷的“这个”就像预料的那样。但是当我将T.makePromise传递给.then()函数时,它将全局对象打印为“this”,我不明白为什么会出现这种情况。

我知道我可以通过以下方式让它发挥作用:

var P = Promise.resolve().then(()=>{return T.makePromise()})

但我不明白为什么我应该这样做。

谢谢。如果这是一个非常基本的问题,我很抱歉。也不是我认为这很重要,但我在节点中使用它。

3 个答案:

答案 0 :(得分:2)

由于您正在传递函数引用,因此它失去与对象T的连接。您没有传递T + makePromise,而是传递makePromise,就像它是一个独立的函数一样。因此T在调用上下文中不能再this

就这样写:

const P = Promise.resolve().then(() => T.makePromise())

现在,在调用makePromise时,范围内可以使用T并自动绑定到this

答案 1 :(得分:1)

您可以尝试类似

的内容
var P = Promise.resolve().then(T.makePromise.bind(T))

答案 2 :(得分:1)

这主要是关于this的问题。因为then函数正在调用T.makePromise,所以调用站点不再是Test的上下文,而是全局上下文。

this反映了使用this调用函数的上下文。一旦你将其传递给异地,除非事先this,否则你无法控制bind的内容。