首页  >  问答  >  正文

JavaScript iterator 迭代器的问题?

看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_leeringa_lee2734 天前725

全部回复(2)我来回复

  • 黄舟

    黄舟2017-05-19 10:49:40

    Iterator的遍历过程是这样的。

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

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

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

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

    回复
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:49:40

    每次 执行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次

    回复
    0
  • 取消回复