JS でのバインドの実装について少し読みました (John Resig の本から):
次のようになります: ( jsbin )
#1Function.prototype.bind = function ()
#2{
#3 var fn = this,
#4 args = Array.prototype.slice.call(arguments),
#5 object = args.shift();
#6
#7 return function ()
#8 {
#9 return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)));
#10 };
#11 };
そして、次のようにテストできます。
var myObject = {};
function myFunction()
{
return this == myObject;
}
//---------
if (!myFunction()) alert("Context is not set yet"); //not set ye
var bindedFunction= myFunction.bind(myObject)
if (bindedFunction()) alert( "Context is set properly"); //set properly
//---------
しかし、私はそれについて2つの質問があります:
Question #1
3 行目のthis
is は実行される関数を指していますね。「関数を保持するオブジェクトthis
」ではありませんか?
alert(this)
bind 関数内で行うと、次のように表示されます。
function myFunction()
{
return this == myObject;
}
Question #2
行 #9 で、なぜ返された関数が
return function ()
{
return fn.apply ...
};
そしてそうではない
return function ()
{
fn.apply ...
};
私はそれを理解していません:
返された関数はクロージャーを作成し、実行中のみの関数を返す必要があります fn.apply(o....
additional を返す理由がわかりませんreturn
: のようにreturn fn.apply(o....