2017-07-10 4 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( "+") 'は完全に別々の2つの配列です。そしてAとBの違いは、Aでは実際に 'call'を使って関数を呼び出すことです.Bでは' this'コンテキストがバインドされた関数を返し、オブジェクトの結合関数を新しくバインドされた関数に設定しています。 – mhodges

+2

あなたはいくつかの質問をしています。 – canon

答えて

-1

1)

AとBとの間の差が有りありコメントで述べたように、Aは objを変更しません。

2)は、BとC

1は、はい、 '++ B ++ 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のネイティブバインドメソッドを使用してバインドされているバインドされた関数をアンバインドすることはできません。 –

関連する問題