严格模式通过强化错误检测暴露迭代器缺陷:箭头函数导致this绑定失效、未声明变量抛ReferenceError、缺少done:true引发无限循环;推荐用普通函数定义[Symbol.iterator]并每次返回新迭代器。

严格模式本身不直接改变 Iterator 协议或 for-of 遍历逻辑,但它会强化可迭代对象实现中的常见错误检测,让迭代器行为更规范、更可预测。
严格模式如何暴露迭代器实现缺陷
在非严格模式下,某些迭代器写法可能“侥幸运行”,但在严格模式下会立即报错,从而倒逼开发者写出符合协议的代码:
- 若
[Symbol.iterator]方法中使用箭头函数(如[Symbol.iterator] = () => { ... }),会导致this绑定失效;严格模式下访问this.items等属性易触发Cannot read property 'xxx' of undefined - 在迭代器的
next()中误用未声明变量(如拼错indx++),非严格模式会悄悄创建全局变量,而严格模式直接抛ReferenceError - 手动实现迭代器时若忘记返回
done: true,for-of 可能无限循环;严格模式虽不拦截该逻辑,但配合调试工具和类型检查(如 TypeScript)更容易定位状态管理漏洞
可迭代对象在严格模式下的推荐写法
为确保遍历行为稳定且可复用,应遵循以下实践(全部兼容严格模式):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
用普通函数定义
[Symbol.iterator]:保证this正确指向实例,支持闭包捕获私有状态(如索引) -
每次调用都返回新迭代器:避免多个 for-of 共享同一状态,例如:
class Range {<br> constructor(start, end) { this.start = start; this.end = end; }<br> [Symbol.iterator]() {<br> let i = this.start;<br> return { next: () => (i < this.end ? { value: i++, done: false } : { done: true }) };<br> }<br>} -
done 为 true 后保持返回确定值:后续
next()必须返回{ done: true }或{ value: undefined, done: true },不可返回undefined或抛错
for-of 在严格模式下对可迭代对象的要求不变,但容错更低
for-of 仍只认 [Symbol.iterator] 方法及其返回值是否合法,但严格模式会让底层实现更“诚实”:
立即学习“Java免费学习笔记(深入)”;
- 如果对象没有
[Symbol.iterator],依然报TypeError: xxx is not iterable(与非严格模式一致) - 如果
[Symbol.iterator]()返回的对象没有next方法,或next()不返回含value和done的对象,同样报错——严格模式不会新增校验,但让这类错误更早暴露 - 自定义对象遍历时,若内部逻辑依赖
arguments或隐式全局变量,严格模式会直接中断执行,防止遍历结果被污染
生成器函数是严格模式下的安全选择
生成器函数(function*)天然满足迭代器协议,且其内部自动启用严格模式(无论外层是否声明 "use strict"):
- 无需手动管理
index和done状态,yield自动处理暂停与恢复 - 返回值既是可迭代对象,也是迭代器(即
iterator[Symbol.iterator]() === iterator) - 语法简洁、不易出错,适合构建 Range、链表、树等结构的遍历逻辑

















