23

Javascript のクロージャをどのように理解できますか?

一般的に言えば、クロージャは 1 つ以上の外部変数にバインドされた関数です。呼び出されると、関数はこれらの変数にアクセスできます。JavaScript では、関数が別の関数内で宣言されているときに、クロージャが実装されることがよくあります。親関数が終了した後でも、内部関数は親関数の変数にアクセスします

このステートメントでは、「クロージャは 1 つ以上の外部変数にバインドされた関数です」というのは、これを実行できるということvar myFun = Function(msg){...};ですか? 正しいですか?

「親関数が終了した後でも」とはどういう意味ですか?

4

3 に答える 3

9

クロージャーは、1 つ以上の外部変数にバインドされた関数です

この概念の例は、関数 bar が外部変数 x、y、および z にバインドされていることです。

function foo(x, y) {
  var z = 3;

  return function bar(a, b, c) {
    return (a + b + c) * (x + y + z);
  };
}

var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24

変数は、 への呼び出しから返されclosureた内部関数を参照します。呼び出しは、 内でスコープを再入力するようなもので、 のすべてのローカル変数とパラメーターを可視化します。barfooclosurefoofoo

親関数が終了した後でも

これは、 が実行された後、変数fooに格納された返された関数がの状態を保持することを意味します。再度呼び出すことで、複数の独立したクロージャーを作成することもできます:closurefoofoo

var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24

var closure2 = foo(0, 0);
closure2(5, 6, 7); // (5 + 6 + 7) * (0 + 0 + 3) = 21

/* closure2 does not affect the other closure */
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24
于 2013-03-27T19:07:29.340 に答える
3

外部変数の解釈が正しくありません。それは本当にこれを行うことができることを意味します:

function make_closure() {
  var x = 20;
  return function() {
    console.log(x);
  };
}

var closure = make_closure();
closure(); // Displays 20

于 2013-03-27T18:57:57.207 に答える
3

どこから引用しているのかわかりませんが、親関数の実行が終了したときに参照しているようです。

于 2013-03-27T19:04:30.963 に答える