3 回答

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

TA貢獻1963條經驗 獲得超6個贊
window默認情況下,在全局對象()的上下文中調用Promise處理程序。在嚴格模式(use strict;)中,上下文為undefined。這就是method2和發生的事情method3。
;(function(){
'use strict'
Promise.resolve('foo').then(function(){console.log(this)}); // undefined
}());
;(function(){
Promise.resolve('foo').then(function(){console.log(this)}); // window
}());
因為method1,您打電話method1為this.method1()。這種調用方式在this您的實例對象的上下文中調用它。這就是為什么內部上下文method1是實例的原因。

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