Javascript 理解js闭包中的迭代器

Javascript 理解js闭包中的迭代器,javascript,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 如何在每次调

我不明白调用这个函数是如何工作的

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?

i
不会重置,因为它是在分配给
next
的函数之外设置的。事实上,在其正上方的行中。

在您的代码中:

> 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
当此行执行时,
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。

可能是@MikeSamuel的副本我以前看过那篇文章,它有点不同,因为我只是好奇这个特定的迭代器,而不是广义的“闭包是如何工作的”。该问题的第一个答案还将回答“每次呼叫时,
i
如何不重置为0?”我不明白。它看起来像是在分配给
next
的函数的第一行上设置的,即<代码>重置()No,行
var next=setup(['a','b','c'])
调用setup函数,该函数返回一个不同的匿名函数<代码>i在该函数之外设置,因此它不会被重置。“因此它对i和x都有一个闭包,其值现在只能由函数更改。”Okayy。但是是什么阻止了
i
每次被重置?如果我在
var I=0
之后的行中放置类似
console.log('after I')
,然后执行三个
console.log(next())s我只在I
一次之后看到
的打印输出-。我只是不明白在第二次和第三次调用时,命名函数
setup()
如何在不执行匿名函数之外的任何操作的情况下被调用。对不起,我太傻了/<代码>i
不会重置,因为
设置
只调用一次。然后,调用
next
,每次分配一个新值(
i++
)。非常感谢。所以知道
setup
是一个函数,因为即使
next()
只指向返回的函数,因为当它最初创建时,它可以访问父函数
setup()
?它可以访问多个“父”功能层?我希望这个问题是清楚的。如果我需要编辑,请告诉我。是的。调用函数时,将创建其作用域链,其中包含每个外部执行上下文。函数可以嵌套得很深(例如递归)。标识符解析与属性解析类似,只是它沿着范围链而不是继承(
[[Prototype]]
)链。