2

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 行目のthisis は実行される関数を指していますね。「関数を保持するオブジェクト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....

4

3 に答える 3

2

のコンテキスト (しゃれは意図されていません)Function.bindではthis、メソッドとしてそれを含む可能性のある「オブジェクト」ではなく、実際に現在呼び出されている関数を参照します。

関数はJSのファーストクラスオブジェクトであることを覚えておいてください。

myFunction.bind()

thenmyFunction オブジェクトであり.bind、そのオブジェクトのメソッド ( を介して継承Function.prototype) であり、呼び出すと通常のルールが適用されます - this === myFunction.

q.2 の場合、バインドされた関数も元の関数と同じように結果を返すことができるように、の結果fn.apply必要です。

于 2013-04-11T11:00:48.710 に答える
1

しかし、これは「機能を保持するオブジェクト」ではないでしょうか。

いいえ。これは、内部的fn.bind(obj)に次のように呼び出されるためです。

Function.bind.call(fn, window, obj)

したがって、thisを参照してfnください。

return fn.apply(o.... のように、追加の return を返す理由がわかりません。

関数.bind()は、呼び出されたときに、指定された関数からの戻り値を「プロキシ」する関数を返すことを意図していますmyFunction。そうでない場合は、常に を返しundefinedます。

于 2013-04-11T11:05:58.140 に答える
0

#2 に対する答えは、バインドされた関数は元の関数が返すものを返す必要があるため、return ステートメントが必要であるということです。

于 2013-04-11T11:00:49.890 に答える