亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在使用諾言時在類方法中未定義“ this”?

為什么在使用諾言時在類方法中未定義“ this”?

Smart貓小萌 2019-12-26 11:14:14
我有一個javascript類,每個方法都返回一個QPromise。我想知道為什么this在method2和中未定義method3。有沒有更正確的方法來編寫此代碼?function MyClass(opts){  this.options = opts;  return this.method1()    .then(this.method2)    .then(this.method3);}MyClass.prototype.method1 = function(){  // ...q stuff...  console.log(this.options); // logs "opts" object  return deferred.promise;};MyClass.prototype.method2 = function(method1resolve){  // ...q stuff...  console.log(this); // logs undefined  return deferred.promise;};MyClass.prototype.method3 = function(method2resolve){  // ...q stuff...  console.log(this); // logs undefined  return deferred.promise;};我可以使用解決此問題bind:function MyClass(opts){  this.options = opts;  return this.method1()    .then(this.method2.bind(this))    .then(this.method3.bind(this));}但是不能完全確定為什么bind有必要。正在.then()消滅this?
查看完整描述

3 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

this始終是調用方法的對象。但是,將方法傳遞給時then(),您不會調用它!該方法將存儲在某個位置,稍后再從那里調用。如果要保存this,則必須這樣做:


.then(() => this.method2())

或者,如果您必須在ES6之前的版本中執行此操作,則需要保留以下內容this:


var that = this;

// ...

.then(function() { that.method2() })


查看完整回答
反對 回復 2019-12-26
?
神不在的星期二

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是實例的原因。


查看完整回答
反對 回復 2019-12-26
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

基本上,您要向其傳遞沒有上下文引用的函數引用??梢酝ㄟ^this幾種方式確定上下文:

  1. 隱含地。調用全局函數或沒有綁定的函數會假定全局上下文。*

  2. 直接參考。如果您致電,myObj.f()myObj將是this上下文。**

  3. 手動裝訂。這是您的函數類,例如.bind.apply。這些您明確聲明了this上下文。這些總是優先于前兩個。

在您的示例中,您正在傳遞一個函數引用,因此在調用它時,它暗示是全局函數或沒有上下文的函數。使用.bind通過在this顯式設置的位置創建新函數來解決此問題。

*僅在非嚴格模式下如此。在嚴格模式下,this設置為undefined。

**假設您使用的功能尚未手動綁定。


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 691 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號