2013-07-16 62 views
2

我運行下面的JS腳本的,但只要找到func2()輸出foobar,不George,誰能夠解釋爲什麼func2 = func.bind(someuser)不綁定someuserfunc混淆的JavaScript綁定功能

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 
var foo = { 
    name: 'foobar' 
}; 
func = someuser.func.bind(foo); 
func(); // output foobar 
func2 = func.bind(someuser); 
func2(); //output foobar 
+1

也許是因爲它已經被綁定了? – Shawn31313

+0

我沒有得到你的問題 – Qchmqs

+0

@ Shawn31313你應該張貼作爲答案btw。 –

回答

0

您已經綁定someuser.func

您可能想要以不同方式設置腳本。

或使用:

func = someuser.func.bind(foo); 
func(); // output foobar 
func2 = someuser.func.bind(someuser); 
func2(); //output foobar 

不要試圖重新綁定已綁定功能。

+0

「應該是:」---你爲什麼這麼認爲? – zerkms

+0

因爲它會返回「George」 – Shawn31313

+0

你確定你完全理解'.bind()'是如何工作的嗎? HTTPS://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – zerkms

4

MDN

的bind()函數(ECMAScript中5個術語內部呼叫屬性)作爲函數它被稱爲上創建一個新的功能(結合的功能)具有相同功能的主體(綁定函數的目標函數),該值綁定到bind()的第一個參數,,它不能被覆蓋

基本上這意味着你不能在已經綁定的函數上調用綁定。

在你的榜樣,你必須做的:

func2 = someuser.func.bind(someuser); 
2

我想你想要的是一個弱綁定:

function weakBind(functable, context) { 
    var GLOBAL = this; 

    return function() { 
     return functable.apply(this === GLOBAL ? context : this, arguments); 
    }; 
} 

現在你可以這樣做:

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 

var foo = { 
    name: 'foobar' 
}; 

var func = weakBind(someuser.func, foo); 
func(); // output foobar 

var func2 = weakBind(func, someuser); 
func2(); //output George 

演示:http://jsfiddle.net/R79EG/


正常綁定的問題在於,一旦將對象綁定到this指針,它就不能被覆蓋。弱綁定檢查this指針是否設置爲GLOBAL對象(在這種情況下使用默認值)。否則它會使用任何新的this指向。


BTW你的情況,它只是更好地做到這一點,而不是:

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 

var foo = { 
    name: 'foobar' 
}; 

var func = someuser.func.bind(foo); 
func(); // output foobar 

var func2 = someuser.func.bind(someuser); 
func2(); //output George 

這總比weakBind因爲調用func2稱之爲func這將依次調用someuser.func。然而使用bind,呼叫func2將直接呼叫someuser.func

+0

+1用於提出解決方案,而不是僅僅告訴他爲什麼它不起作用。 –