2016-09-07 10 views
2

.bind()がカスタムプロパティを機能から削除する理由を理解しようとしています。 _$somethingメソッドを「削除」する関数のコンテキストを変更すると、実際にはどうなりますか?なぜFunction.prototype.bind()は関数からカスタムプロパティを削除するのですか?

function xxx(){ 
//do nothing 
} 
xxx._$something = 'something'; 
document.getElementById('id1').innerText = xxx._$something; 
//'something' 

var functions = []; 

functions.push(xxx); 
document.getElementById('id2').innerText = functions[0]._$something; 
//'something' 

functions.push(xxx.bind({})); 
document.getElementById('id3').innerText = functions[1]._$something; 
//'undefined' 

console.log(functions[1]); //logs xxx 

JS fiddle

+0

'bind()'は新しい関数を返します。なぜそれはそれに任意のプロパティを持っていますか? –

+0

バインドがオブジェクト(関数)のコピーを返す場合、同じプロパティを持つと期待します。 –

+0

オブジェクトのコピーを返しません。それは目標ではありません。 –

答えて

5

bindそれは新しい関数を返し、何も削除されません。

the MDNより:

バインド()メソッドが提供された先行 引数の指定された配列と、呼び出されたときに、与えられた値に設定し、その このキーワードを有し、新たな機能を作成します新しい関数が呼び出されます。

はそれをより明確にするには:

var f2 = f1.bind(obj); 

var f2 = (function(f, v){ 
    return function(){ 
     return f.apply(v, arguments); 
    } 
})(f1, obj); 
本来の機能がコピーされませんいずれの場合も

しかし包まとほぼ同等です。

+0

どの新しい関数に_ $ somethingメソッドがないので... – Masterakos

+0

新しい関数を返す場合は、同じメソッドを持つコピーではないでしょうか? –

+0

@LJWadowskiプロパティをコピーしなければならないと指定されておらず、とにかくほとんど役に立たないでしょう。たとえば、名前は同じではありません(実際には、「バウンドxxx」などの元の名前から構築されます)。 –

関連する問題