検索

ホームページ  >  に質問  >  本文

JavaScript - クロージャを初めて学習したのでよくわかりません。アドバイスをお願いします。

リーリー

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

大家讲道理大家讲道理2765日前697

全員に返信(7)返信します

  • 学习ing

    学习ing2017-06-26 11:00:00

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

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-26 11:00:00

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

    返事
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-26 11:00:00

    リーリー

    返事
    0
  • 世界只因有你

    世界只因有你2017-06-26 11:00:00

    リーリー

    返事
    0
  • 阿神

    阿神2017-06-26 11:00:00

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

    リーリー

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

    リーリー

    返事
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 11:00:00

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

    を意味します リーリー

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

    返事
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 11:00:00

    リーリー

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

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

    返事
    0
  • キャンセル返事