2016-09-20 41 views
1

下面的代碼中使用時:深刻的理解:爲什麼.bind(這一點)似乎並沒有遵循正常規則,新希望

var this_module = { 

    foo: 'something', 

    promise: function() { 

     return new Promise (function(resolve, reject) { 

      resolve (this.foo); 
     }.bind(this)) 
    } 
} 

成功綁定thisthis_module。我不明白爲什麼。

new運營商通常將this設置爲作爲對給定函數的構造調用的一部分創建的對象。這意味着對Promise函數的構造調用會將this設置爲Promise對象。如果是這種情況,則.bind(this)也應該將執行器功能的this設置爲Promise對象。

或者.bind(this)應該將執行器函數的this設置爲Promise函數(在上例中應該是全局對象)的this值。

爲什麼不是這樣?

+9

的'new'運營商無關,與你傳遞給函數到'承諾'。你在'Promise'上調用'new',而不是你傳遞給'Promise'的函數。 *「如果是這種情況,則'.bind(this)'還應該將執行程序函數的'this'設置爲Promise對象。」*當您調用'.bind(this)'時,promise對象不存在' 。 'this'指的是'promise'中指的是'function(){}'。我很困惑,你認爲它應該不是'this_module'。它完全遵循*「正常」規則。 –

+2

如果你有'var handler = function(resolve,reject){...} .bind(this);返回新的Promise(處理程序);'而不是? –

+0

那麼爲什麼'this'不參考Promise函數中的全局對象呢? – rabbitco

回答

3
var this_module = { 

    foo: 'something', 

    promise: function() { 
    return new Promise(function(resolve, reject) { 
     resolve(this.foo); 
    }.bind(this)); 
    } 

}; 

適用this的正常規則。在bind(this)中的this發生在this_module的方法promise內,因此通過定義參考this_module(假設它被稱爲this_module.promise())。因此,它正在應用的函數(在此情況下,執行程序 - 該函數作爲參數傳遞到new Promise)內的this指的是this_module,並且可以訪問foo。這裏沒有什麼奇怪的事情發生。

正如評論中所解釋的那樣,執行者所綁定的並因此在執行者內部執行的this與該承諾無關,或與任何涉及新承諾的this無關。事實上,您無法通過設計來訪問正在構建的承諾。任何涉及新承諾的this正在Promise構造函數中發生,這對您而言是不可見的。

也許downvotes是由於這個代碼可以很簡單地由this的正常規則解釋,但它們似乎有點苛刻。

你可能會認爲你寫的完全等效於以下內容:

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); 
    ); 
    } 

}; 
+0

謝謝@torazaburo! – rabbitco

相關問題