2

http://ejohn.org/apps/learn/#84から取得

function bind(context, name){ 
  return function(){ 
    return context[name].apply(context, arguments); 
  }; 
} 

私は本当にこれがどのように機能するかを理解しようとしています。この関数は機能しますが、最も内側の関数からconsole.log引数を指定した場合、それらは存在しません。では、それらが呼び出されるapply関数でどのように使用できるのでしょうか。

言い換えると:

function bind(context, name){ 
  console.log(arguments.length === 2, true);
  return function(){ 
    console.log(arguments.length === 0, true);
    return context[name].apply(context, arguments); 
  }; 
} 

外部関数の引数をconsole.logして、lengthプロパティを取得できます。しかし、その最も内側の関数から、arguments.length===0です。

4

1 に答える 1

2

単純化するために、今のところ閉鎖を忘れてください。

この関数bindは、次のような関数を返します。

function returnedFunction() {
    return context[name].apply(context, arguments);
}

したがって、私が呼び出す場合returnedFunction(1,2,3);、引数は1, 2, 3です。私が呼ぶならreturnedFunction()、議論はありません。

ここで、心配する必要がcontextあります。nameこれundefinedは単純化の対象になります。これは、クロージャーを見て、それらが外部関数で定義されていることを確認するときです。

arguments変数でthisはないため、閉じることはできません。これらは、関数呼び出しごとに個別に評価されます。それらは、bind渡した引数について評価さbindれ、次に、returnedFunctionを呼び出すたびに評価されますreturnedFunction

bindから返される関数は互いに関係がないことに注意してください。それらはそれぞれ、異なるバインディングを持つ独自の環境を持っていcontextます。name

于 2013-03-22T15:36:53.487 に答える