在不支持 Generator 的环境中,可用闭包模拟迭代器:返回含 next() 方法的对象,闭包保存索引与数据实现状态隔离,next() 返回 {value, done},符合迭代器协议,支持多实例与重置。
在不支持 generator(如早期 javascript 环境或严格限制 `function*` 的沙箱)时,可以用闭包封装状态,手动模拟迭代器行为:返回一个带 next() 方法的对象,每次调用返回 { value, done }。
核心思路:用闭包保存索引和数据引用
闭包能持久化当前遍历位置(如 index)和源数据(如数组),避免暴露内部状态,同时保证多次调用 next() 时状态连续。
- 闭包外层接收原始数据(如数组、类数组或键值对)
- 内层函数返回的迭代器对象,其
next()方法读取并递增私有index - 返回值结构严格符合迭代器协议:
{ value: 当前项, done: 是否结束 }
基础数组迭代器实现
适用于纯数值/任意类型数组,只遍历元素值:
for...of
- 每次调用
createArrayIterator(arr)都生成全新闭包,彼此状态隔离 - 如需重置,只需再次调用工厂函数获取新迭代器,无需修改原逻辑
- 不依赖
this或原型链,兼容严格模式和无class环境











