为什么不能以这种方式实例化迭代器?

时间:2016-01-14 09:15:45

标签: javascript ecmascript-6

首先,看看这段代码。

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的方式不同(或等效)吗?

2 个答案:

答案 0 :(得分:7)

当您将其称为si1()时,该函数的thisundefinedarr[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();