2017-07-10 115 views
0

你能解釋的區別:約束力,借款方法

var obj = { 
    0: "A", 
    1: "B", 
    2: "C", 
    length: 3, 
    print: function(){ console.log(this) } 
}; 

//A (borrowing method. No changes in obj): 
[].join.call(obj, "+"); //-> "A+B+C" 

//B: 
obj.join = [].join.bind(obj); 
obj.join("+"); //-> "A+B+C" 
var oj = obj.join; 
oj("-"); //-> "A-B-C" (binded to obj) 

//C: 
obj.j = [].join; 
obj.j("++"); //-> "A+B+C" 
var j = obj.j; 
j("-"); //-> "A-B-C" (it still binded!) 

//D: 
var join = [].join.bind(obj) 
join("+"); //-> "A+B+C" 

//E (not working: [] is a new array every time): 
[].join.bind(obj); 
[].join("+"); //expected: "A+B+C" but I have: "" 

//F (Danger!) 
Array.prototype.join = [].join.bind(obj); 
[].join("+"); //"A+B+C" 

你能否解釋一下是有A和B之間的區別?
B和C有什麼區別?
爲什麼E不起作用?

(額外的問題)你能解釋如何在F後解除綁定方法嗎?

Array.prototype.join = [].join.bind(null); 
[].join([1,2,3,4],"+"); //-> "ABC" 
+0

[請不要把問題標題標籤(https://stackoverflow.com/help/tagging) – Liam

+0

嘛,E不因爲工作' [] .join.bind(obj)'和'[] .join(「+」)'是兩個完全獨立的數組。 A和B之間的區別在於,你實際上是用'call'調用函數,而在B中你是用綁定的'this'上下文返回函數,並將對象的連接函數設置爲新綁定的函數。 – mhodges

+2

你在問幾個問題。 – canon

回答

-1

1)是否有A和B

之間的差別是,在註釋中A不修改obj

2)是否有B和C

除了一個事實,就是將打印 'A ++ ++乙C',是有區別的。 B是明確綁定的,而C不是這意味着它可能會丟失上下文。請嘗試以下操作:

var fn = obj.join 
var fn2 = obj.j 

console.log(fn('+')) // works 
console.log(fn2('+')) // error 

3)爲什麼E不工作?

[].join.bind(obj); 
//^this is an array instance 
// calling `join.bind(obj)` makes no modification to that array instance or any other 
[].join("+"); //expected: "A+B+C" but I have: "" 
//^this is different array instance, unaffected by the above call 

4)你能解釋一下如何到F後解除綁定的方法?

您無法解除綁定使用javascript的本機bind方法綁定的綁定函數。您可以編寫自己的版本,這是不可取的,但這不是本機API的一部分。

這裏是一個簡單的實現:

function bind(fn, context) { 
    var newFn = function() { return fn.call(context, arguments) } 
    newFn.unbind = function() { return fn } 
    return newFn 
} 

function checkCtx (a) { console.log(this, a) } 
checkCtx(1); // Window, 1 
bind(checkCtx, {})(1) // {}, 1 
bind(checkCtx, {}).unbind()(1) // Window, 1 
+0

感謝您的解釋和解決方案如何解除綁定方法: **您無法解除綁定**使用javascript的本地綁定方法綁定的綁定函數。 –