我不明白如何调用此函数
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?
答案 0 :(得分: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
执行此行时,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
的函数之外设置的。实际上在它正上方的那一行。