理解js闭包中的迭代器

时间:2013-03-05 08:13:14

标签: javascript

我不明白如何调用此函数

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?

2 个答案:

答案 0 :(得分:1)

在您的代码中:

> function setup(x) {
>     var i = 0;

调用setup时,会创建一个包含局部变量xi的新执行上下文。执行开始时,x被赋予传递数组的值,i被设置为零。

>     return function () {
>         console.log(i);
>         return x[i++];
>     };

返回此匿名函数。它有一个关闭外部执行对象的闭包,它放在它的作用域链上(全局执行对象也是如此)。

因此它对ix都有一个闭包,其值现在只能由函数更改。

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

返回的函数已分配给next,因此它不再是匿名的。

> 
> console.log(next());//a

执行此行时,next会返回x[0],即“a”,并将i增加为1.

> console.log(next());//b

执行此行时,next会返回x[1],即“b”,并将i增加为2.

> console.log(next());//c

执行此行时,next会返回x[2],即“c”,并将i增加到3。

答案 1 :(得分:0)

i未重置,因为它是在分配给next的函数之外设置的。实际上在它正上方的那一行。