あなたのコードで:
> function setup(x) {
> var i = 0;
がsetup
呼び出されると、新しい実行コンテキストがローカル変数x
とで作成されますi
。実行が開始x
されると、渡された配列の値が割り当てられ、i
ゼロに設定されます。
> return function () {
> console.log(i);
> return x[i++];
> };
この無名関数が返されます。スコープチェーンに配置された外側の実行オブジェクトへのクロージャーがあります (グローバル実行オブジェクトもそうです)。
そのため、 と の両方にクロージャーがi
ありx
、その値は関数によってのみ変更できるようになりました。
> }
>
> var next = setup(['a', 'b', 'c']);
返された関数は に割り当てられるためnext
、匿名ではなくなります。
>
> console.log(next());//a
この行が実行されると、「a」である がnext
返され、 1 にインクリメントされます。x[0]
i
> console.log(next());//b
この行が実行されると、「b」である がnext
返され、 2 にインクリメントされます。x[1]
i
> console.log(next());//c
この行が実行されると、「c」である がnext
返され、 3 にインクリメントされます。x[2]
i