2017-07-31 62 views
1

在 [MDN] [綁定]使用綁定功能進行二次

我們看到這種類似的代碼

this.x = 9; // this refers to global "window" object here in the browser 
var module = { 
    x: 81, 
    getX: function() { return this.x; } 
}; 
module.getX(); // 81 
var retrieveX = module.getX; 
retrieveX(); 
// returns 9 - The function gets invoked at the global scope 
var boundGetX = retrieveX.bind(module); 
boundGetX(); 

是的,我知道的綁定將改變「這個」價值,但我迷惑代碼如下

var demo=boundGetX.bind(this);// or boundGetX.bind(window); 
demo();// still 81 

再次使用綁定,我認爲它會改變「this」指向「窗口」,但它不是。 我不知道爲什麼。

+0

'boundGetX'將是一個函數,它調用模塊上的retrieveX,而不管它接收到了什麼'this'值。現在,如果你再次「綁定」,那麼'window'就會被忽略。 – Bergi

+0

必須有一個副本,對吧?任何人? – Bergi

回答

1

bind返回一個新函數,它在調用時保持原始函數的上下文完好無損。它在本質上做到這一點:

function bind(originalFunction, context) { 
    return function() { 
     originalFunction.call(context); 
    }; 
} 

不管你如何調用綁定功能,或者你做的,還有什麼,originalFunction將與特定的上下文調用。您可以重新綁定該綁定函數,該函數將返回另一個新函數,但不會影響「內部包裝」原始函數和上下文。