JavaScript iterator 迭代器的問題?
ringa_lee
ringa_lee 2017-05-19 10:47:40
0
2
732

看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次
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板