クロージャーは、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
た内部関数を参照します。呼び出しは、 内でスコープを再入力するようなもので、 のすべてのローカル変数とパラメーターを可視化します。bar
foo
closure
foo
foo
親関数が終了した後でも
これは、 が実行された後、変数foo
に格納された返された関数がの状態を保持することを意味します。再度呼び出すことで、複数の独立したクロージャーを作成することもできます:closure
foo
foo
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