JavaScript - クロージャを初めて学習したのでよくわかりません。アドバイスをお願いします。
大家讲道理
大家讲道理 2017-06-26 10:58:00
0
7
682
リーリー

box() の実行後、arr[0] から arr[4] の値がすべて function () { return i;}
ではないのはなぜですか: function () {return 0;} 、関数 () {戻り値 1;}。 。 。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(7)
学习ing

クロージャーは関数内の変数の最後の値しか取得できないため、ここでは変数 i を参照しています。box() 関数は実行後に関数配列を返し、配列内の各 i は同じ変数 i を参照します。 box() は関数を返すことに注意してください。したがって、内部の {return i} は関数内の単なるステートメントであり、まだ実行されていないため、当然のことながら {return i} は変更されません。同じ外部 i を参照しているため、box() 関数がリターンするときの外部変数 i の値は 5 です。このとき、各リターンは変数 i を保存している同じ変数オブジェクトを参照しているため、内部arr[] の関数、各関数内の i の値は 5 です。

リーリー
いいねを押す +0
伊谢尔伦

クロージャに関連付けられたスコープチェーンが「ライブ」であるため 、バインドされた各変数の値の独自のコピーを割り当てるのではなく、 i の値を参照するだけです。各段階では保存されません参考書籍: JavaScript の決定版ガイド セクション 8.6.

いいねを押す +0
淡淡烟草味

リーリー

いいねを押す +0
世界只因有你

リーリー

いいねを押す +0
阿神

この例では、forループ内の関数は値が代入されるだけで実行されないため、iの値は配列内の関数が実行されたときにのみ取得されます。このとき、iには末尾の値しかありません。ループ。上層ではクロージャーは使用されず、即時関数のみが使用されます。実行された匿名関数は各ループの i の値を取得します。
方法: 1. ES6 let を使用して var
function box() {

リーリー

2. クロージャーを使用する
function box() {

リーリー
いいねを押す +0
我想大声告诉你

。 「クロージャ」という言葉は、実行されるコードのブロック (自由変数がブロック内に含まれるため、これらの自由変数とそれらが参照するオブジェクトは解放されません) と自由変数に提供されるバインディングの組み合わせに由来します。コンピューティング環境 (範囲) ---Baidu 百科事典
とは

を意味します リーリー

これはコード ブロックです。その機能は i を参照することだけなので、i を保持すると i が解放されなくなります。このコード ブロックが実行される前は、i が何であるかはわかりません。実行中にのみ i が検索されるため、すべての arr を出力でき、すべての出力は 5 になるはずです

いいねを押す +0
我想大声告诉你

リーリー

が何であるかは、 i が呼び出されたときにのみ計算されます。

これらの関数を呼び出すと、forが終了しているため、for 已经结束,因此取 i 的时候值是 5を取得するときの値は5になります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート