闭包通过封装私有状态变量(如index、done)使迭代器每次调用next()都能读取并更新同一份数据;生成器函数底层也依赖类似闭包的状态机机制实现暂停/恢复。

JavaScript 中闭包在迭代器或生成器函数中维护指针状态,核心是把当前索引、遍历进度、完成标志等变量封装在外层函数作用域内,让每次调用 next() 都能读取并更新同一份私有数据。
用闭包手动实现迭代器指针
不依赖 function*,纯函数方式创建可复用的迭代器:
- 外层函数接收数据源(如数组),初始化
index = 0、done = false等状态变量 - 返回的
next()函数在闭包中访问并递增index,判断是否越界,返回{ value, done } - 每个迭代器实例拥有独立闭包,多个调用互不影响。例如:
const it1 = createIterator([1,2]); const it2 = createIterator([3,4]);,it1和it2各自维护自己的index
闭包如何支撑生成器函数的暂停/恢复机制
虽然 function* 是语法糖,但其底层行为与闭包逻辑一致:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用生成器函数时,引擎为其创建一个隐藏的状态机,其中包含当前执行位置、局部变量快照、yield 暂停点等——这些本质上就是被“自动闭包化”的内部状态
- 每次
next()调用都恢复该状态环境,继续执行到下一个yield或return,指针自然延续 - 你写的
let i = 0; while (i ,其中 <code>i就像闭包里的变量,不会因函数退出而重置
为什么不用 this 或全局变量?
闭包提供更干净的状态隔离方案:
-
this容易被调用上下文篡改,且多个实例需手动绑定,易出错 - 全局变量或模块级变量会导致所有迭代器共享状态,破坏可复用性
- 闭包让状态天然私有:外部无法直接读写
index,只能通过next()接口操作,符合封装原则
实际使用中的关键细节
确保指针真正“持续”需要关注几点:
- 状态变量必须声明在工厂函数内部(如
function createIterator(arr) { let index = 0; ... }),不能提至外层作用域 - 返回的
next必须是同一个函数引用,避免每次调用都新建闭包导致状态丢失 - 若需支持
reset()或return(),也在同一闭包内操作相同变量,保持一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










