看MDN上面关于迭代器的章节
https://developer.mozilla.org...生成器表达式
然后就自己练习,发现一个问题。
//下面这个例子 ,想要实现打印3,4,5
var add=function(x,y){
var current=x;
return {
[Symbol.iterator]:function(){return this;},
next:function(){ return current++;}
}
}
var it=add(3,5);
console.log(it.next());
console.log(it.next());
console.log(it.next());
//结果 3 4 5
//注意与下面这种写法的区别
console.log(add(3,5).next()); //3
console.log(add(3,5).next()); //3
console.log(add(3,5).next()); //3
代码比较简单吧,我想问的是为什么第二种方法,我没有将add()方法赋值给it的时候,就不能够生成迭代了。按照我的理解,在这个例子中的add(3,5)是和it等效的,但是结果显然不是如此。
Iterator的遍历过程是这样的。
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。
每次 执行add都会得到一个对象。这些对象各有一份互相独立的current。所以一次
it = add()
和多次add()
是不等效的。