看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等效的,但是結果顯然不是如此。
黄舟2017-05-19 10:49:40
Iterator的遍歷過程是這樣的。
(1)建立一個指針對象,指向目前資料結構的起始位置。也就是說,遍歷器物件本質上,就是一個指針對象。
(2)第一次呼叫指針對象的next方法,可以將指標指向資料結構的第一個成員。
(3)第二次呼叫指針對象的next方法,指標就指向資料結構的第二個成員。
(4)不斷呼叫指向象的next方法,直到它指向資料結構的結束位置。
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次