首先,看看这段代码。
var arr = [1,2,3,4];
> undefined
var si1 = arr[Symbol.iterator];
> undefined
var it1 = si1();
> Uncaught TypeError: Cannot convert undefined or null to object(…)(anonymous function) @ VM11886:2InjectedScript._evaluateOn @ VM9769:875InjectedScript._evaluateAndWrap @ VM9769:808InjectedScript.evaluate @ VM9769:664
var it2 = arr[Symbol.iterator]();
> undefined
it2.next()
> Object {value: 1, done: false}
现在问题是:为什么会产生类型错误?我调用it1
的方式与我调用it2
的方式不同(或等效)吗?
答案 0 :(得分:7)
当您将其称为si1()
时,该函数的this
为undefined
。 arr[Symbol.iterator]()
将this
设置为arr
。
考虑到
arr[Symbol.iterator] === Array.prototype[Symbol.iterator]
必须是调用函数时的上下文决定了结果。
答案 1 :(得分:2)
除了Ryan O'Hara的回答,你可以将迭代器绑定到正确的上下文:
var si1 = arr[Symbol.iterator].bind(arr);
var it1 = si1();
it1.next();