0

私はこの機能を見ています

function foo(x) {
  var tmp = 3;
  return function (y) {
    alert(x + y + (++tmp));
  }
}
var bar = foo(2); // bar is now a closure.
bar(10);

実行すると、変数は次の値を取得します

x = 2、y = 10 tmp = 3。

foo(2) では x が 2 として渡されていることがわかります。したがって、x が 2 の値を取得していることは理解できます。しかし、bar(10) は y に 0 の値を代入しています。どのようだ?10 が bar(10) によって割り当てられた y の値であることを受信関数がどのように認識するかについて混乱しています

4

2 に答える 2

2

foo(2)1 つのパラメーター ( ) を受け入れる無名関数を返しますybarの戻り値になるように設定しているfoo(2)ため、barその無名関数への参照になります。

したがって、bar(10)呼び出すと、匿名関数のfoo戻り値が呼び出さ10れ、パラメーターに設定されますy

于 2012-05-20T16:04:45.593 に答える
2

これは閉鎖です。

あなたが書くとき:

var bar = foo(2);

実際にを呼び出し fooているため、最終的な結果は次のようになります。

var bar = function (y) {
    alert(2 + y + (++tmp));
}

wheretmpは、クロージャーによってスコープ内でバインドされた値です。

したがって、その後、次のように呼び出します。

bar(10);

その関数に渡さ10れ、結果は次のようになります。

alert(2 + 10 + (++tmp));

tmpで作成された関数を呼び出すたびに増加しますfoo

于 2012-05-20T16:07:46.323 に答える