3 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
this始終是調(diào)用方法的對(duì)象。但是,將方法傳遞給時(shí)then(),您不會(huì)調(diào)用它!該方法將存儲(chǔ)在某個(gè)位置,稍后再從那里調(diào)用。如果要保存this,則必須這樣做:
.then(() => this.method2())
或者,如果您必須在ES6之前的版本中執(zhí)行此操作,則需要保留以下內(nèi)容this:
var that = this;
// ...
.then(function() { that.method2() })

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
window默認(rèn)情況下,在全局對(duì)象()的上下文中調(diào)用Promise處理程序。在嚴(yán)格模式(use strict;)中,上下文為undefined。這就是method2和發(fā)生的事情method3。
;(function(){
'use strict'
Promise.resolve('foo').then(function(){console.log(this)}); // undefined
}());
;(function(){
Promise.resolve('foo').then(function(){console.log(this)}); // window
}());
因?yàn)閙ethod1,您打電話method1為this.method1()。這種調(diào)用方式在this您的實(shí)例對(duì)象的上下文中調(diào)用它。這就是為什么內(nèi)部上下文method1是實(shí)例的原因。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
基本上,您要向其傳遞沒有上下文引用的函數(shù)引用??梢酝ㄟ^this
幾種方式確定上下文:
隱含地。調(diào)用全局函數(shù)或沒有綁定的函數(shù)會(huì)假定全局上下文。*
直接參考。如果您致電,
myObj.f()
那myObj
將是this
上下文。**手動(dòng)裝訂。這是您的函數(shù)類,例如
.bind
和.apply
。這些您明確聲明了this
上下文。這些總是優(yōu)先于前兩個(gè)。
在您的示例中,您正在傳遞一個(gè)函數(shù)引用,因此在調(diào)用它時(shí),它暗示是全局函數(shù)或沒有上下文的函數(shù)。使用.bind
通過在this
顯式設(shè)置的位置創(chuàng)建新函數(shù)來解決此問題。
*僅在非嚴(yán)格模式下如此。在嚴(yán)格模式下,this
設(shè)置為undefined
。
**假設(shè)您使用的功能尚未手動(dòng)綁定。
添加回答
舉報(bào)