クロージャーは関数内の変数の最後の値しか取得できないため、ここでは変数 i を参照しています。box() 関数は実行後に関数配列を返し、配列内の各 i は同じ変数 i を参照します。 box() は関数を返すことに注意してください。したがって、内部の {return i} は関数内の単なるステートメントであり、まだ実行されていないため、当然のことながら {return i} は変更されません。同じ外部 i を参照しているため、box() 関数がリターンするときの外部変数 i の値は 5 です。このとき、各リターンは変数 i を保存している同じ変数オブジェクトを参照しているため、内部arr[] の関数、各関数内の i の値は 5 です。
この例では、forループ内の関数は値が代入されるだけで実行されないため、iの値は配列内の関数が実行されたときにのみ取得されます。このとき、iには末尾の値しかありません。ループ。上層ではクロージャーは使用されず、即時関数のみが使用されます。実行された匿名関数は各ループの i の値を取得します。 方法: 1. ES6 let を使用して var function box() {
クロージャーは関数内の変数の最後の値しか取得できないため、ここでは変数 i を参照しています。box() 関数は実行後に関数配列を返し、配列内の各 i は同じ変数 i を参照します。 box() は関数を返すことに注意してください。したがって、内部の {return i} は関数内の単なるステートメントであり、まだ実行されていないため、当然のことながら {return i} は変更されません。同じ外部 i を参照しているため、box() 関数がリターンするときの外部変数 i の値は 5 です。このとき、各リターンは変数 i を保存している同じ変数オブジェクトを参照しているため、内部arr[] の関数、各関数内の i の値は 5 です。
リーリークロージャに関連付けられたスコープチェーンが「ライブ」であるため 、バインドされた各変数の値の独自のコピーを割り当てるのではなく、 i の値を参照するだけです。各段階では保存されません。 参考書籍: JavaScript の決定版ガイド セクション 8.6.
リーリー
リーリー
この例では、forループ内の関数は値が代入されるだけで実行されないため、iの値は配列内の関数が実行されたときにのみ取得されます。このとき、iには末尾の値しかありません。ループ。上層ではクロージャーは使用されず、即時関数のみが使用されます。実行された匿名関数は各ループの i の値を取得します。
リーリー方法: 1. ES6 let を使用して var
function box() {
2. クロージャーを使用する
リーリーfunction box() {
。 「クロージャ」という言葉は、実行されるコードのブロック (自由変数がブロック内に含まれるため、これらの自由変数とそれらが参照するオブジェクトは解放されません) と自由変数に提供されるバインディングの組み合わせに由来します。コンピューティング環境 (範囲) ---Baidu 百科事典
を意味します リーリーとは
これはコード ブロックです。その機能は i を参照することだけなので、i を保持すると i が解放されなくなります。このコード ブロックが実行される前は、i が何であるかはわかりません。実行中にのみ i が検索されるため、すべての arr を出力でき、すべての出力は 5 になるはずです
リーリー
が何であるかは、
i
が呼び出されたときにのみ計算されます。これらの関数を呼び出すと、
for
が終了しているため、for
已经结束,因此取i
的时候值是5
を取得するときの値は5
になります