闭包在迭代器模式中通过外部函数的局部变量保存私有游标index,内部函数利用词法作用域持续访问并自增它,配合数组长度判断边界,确保状态不被外部篡改且符合迭代终止逻辑。

闭包在迭代器模式中保存当前游标,本质是把索引(如 index)定义在外部函数作用域内,再通过返回的内部函数持续访问和更新它——外部无法直接读写,但每次调用都能推进并返回对应元素。
游标变量必须私有化在闭包内
不能把 index 放在全局或对象属性上,否则状态易被意外修改。正确做法是在工厂函数(如 createIterator)中声明局部变量,让返回的迭代函数通过词法作用域“记住”它。
- 外部函数执行一次,初始化
let index = 0 - 返回的函数体里直接读写这个
index,无需参数传入 - 每次调用该函数,
index自增,然后返回arr[index - 1]或判断越界后返回undefined
典型实现结构要包含边界判断
真实场景中,游标不能无限递增。迭代器需明确何时停止,通常靠数组长度控制:
- 内部函数先检查
index ,成立才取值并自增 - 不满足时可返回
{ done: true, value: undefined }(符合 ES6 迭代器协议) - 或者简单返回
undefined,由使用者自行判断结束
一个可直接运行的示例
下面代码创建了一个带游标封装的迭代器:
立即学习“Java免费学习笔记(深入)”;
function createIterator(arr) {
let index = 0;
return function() {
if (index < arr.length) {
return arr[index++];
}
return undefined;
};
}
<p>const it = createIterator(['a', 'b', 'c']);
console.log(it()); // 'a'
console.log(it()); // 'b'
console.log(it()); // 'c'
console.log(it()); // undefined这里 index 完全对外隐藏,每次调用 it() 都自动推进,正是闭包对游标状态的可靠保存。


















