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]]
)链。