在ecmascript中我們知道可以通過for in語句進行對象屬性的周遊,當然這些屬性不包括繼承而來的屬性:
在firefox以及其他浏覽器實作的js語言擴充中,增加了each語句,each和in類似,不過它周遊的是對象的屬性值:
在js擴充中還有更為通用的可疊代對象,in和each語句可以應用在任何可疊代對象;所謂可疊代對象是可以生成“下一個”值的對象,它要滿足以下2個基本條件:
1.必須包含一個值為函數的__iterator__屬性;
2.該函數必須傳回一個對象,這個對象必須有一個next函數屬性用來生成下一個值。一般來說我們将該對象稱為疊代器對象;
如果你的目的是建立一個有限的疊代器(你并不想周遊死循環吧),那麼當疊代到末尾時,需要抛出stopiteration異常;注意該異常隻是個對象而已,并不是一個構造器函數,是以不必用new來建立。而each或in語句内部可以自動處理該異常,是以一般沒必要自己寫catch來手動捕獲該異常以便跳出疊代器的幹活了。
我們下面利用函數的閉包,将一個可疊代對象封裝在一個函數中:
下面<code>這裡寫代碼片</code>分别用in和each來疊代可疊代器對象: