为何无法将迭代器方法赋值给变量后调用执行?
为什么直接赋值数组的Symbol.iterator方法后调用会报错?
当你执行test = [1][Symbol.iterator]时,只是把数组原型上的Symbol.iterator函数本身赋值给了变量test,并没有绑定它原本的上下文(也就是数组[1])。
核心原因:函数调用时的this绑定问题
- 在可行代码里,
[1][Symbol.iterator]()是直接在数组对象上调用方法,此时函数内部的this会自动绑定到数组[1],方法可以正常访问数组的内部数据,生成对应的迭代器。 - 在不可行代码里,
test()是作为普通函数调用,此时this的默认绑定规则会让它指向undefined(在严格模式或现代浏览器的模块环境中),而Symbol.iterator方法内部需要依赖this指向一个可迭代对象(这里是数组)才能工作,当this为undefined时,方法尝试对其进行对象操作,就会抛出Cannot convert undefined or null to object的错误。
修复方法
如果你想把这个方法赋值给变量后正常调用,可以用bind()方法手动绑定this到原数组:
test = [1][Symbol.iterator].bind([1]); test().next(); // 返回 { value: 1, done: false }
内容的提问来源于stack exchange,提问作者user463535
相关产品推荐
相关产品推荐

