0

この関数の呼び出し方法がわかりません

function setup(x) {
    var i = 0;
    return function () {
        console.log(i);
        return x[i++];

    };
}

var next = setup(['a', 'b', 'c']);

console.log(next());//a
console.log(next());//b
console.log(next());//c

i呼び出しごとに0にリセットされないのはなぜですか?

4

2 に答える 2

1

あなたのコードで:

> 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

于 2013-03-05T08:45:23.320 に答える
0

iは に割り当てられた機能の外で設定されたため、リセットされませんnext。実際にはそのすぐ上の行にあります。

于 2013-03-05T08:15:21.950 に答える