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

Bar*_*ski 4 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}
Run Code Online (Sandbox Code Playgroud)

现在问题是:为什么会产生类型错误?我打电话的方式it1不一样(或等同)it2吗?

Ry-*_*Ry- 7

当你调用它si1(),函数有一个thisundefined.arr[Symbol.iterator]()设置thisarr.

考虑到这一点

arr[Symbol.iterator] === Array.prototype[Symbol.iterator]
Run Code Online (Sandbox Code Playgroud)

它必须是调用函数时的上下文决定结果的内容.