JavaScript iterator 迭代器的问题?
ringa_lee
ringa_lee 2017-05-19 10:47:40
0
2
734

看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等效的,但是结果显然不是如此。

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
黄舟

Iterator的遍历过程是这样的。

(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。

phpcn_u1582

每次 执行add都会得到一个对象。这些对象各有一份互相独立的current。所以一次 it = add() 和多次 add() 是不等效的。

var it=add(3,5); // 对象1
console.log(it.next()); // 对象1 第1次 
console.log(it.next()); 
console.log(it.next()); // 对象1 第3次

console.log(add(3,5).next()); // 对象2 第1次
console.log(add(3,5).next()); // 对象3 第1次
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板