任何使用關鍵字yield的函式(哪怕yield在**邏輯中是不可達的)都稱為「生成器函式」(generator function),生成器函式通過yield返回值。這些函式可以通過return終止函式的執行而不帶任何返回值,但不能使用return返回乙個值。
然而和普通函式一樣,生成器函式也通過關鍵字function宣告,typeof運算子也返回」function」,並且可以從function.prototype繼承屬性和方法。要點是:生成器函式呼叫並不執行生成器函式的函式體,而是返回乙個生成器物件!
生成器物件包含乙個next()方法,可以恢復生成器函式的執行,直到遇到下乙個yield語句為止。這時生成器函式中的yield語句的引數就是next()方法的返回值值,如果生成器函式執行return或者到達函式體的末尾終止,則next()將丟擲stopiteration.
function
r(min,max)
for(let n in r(1,10))
console.
log(n);
生成器包含乙個close()方法,當呼叫時和它相關的生成器函式就會終止執行,就像在函式執行掛起位置執行了一條return語句。如果當前掛起位置在乙個或多個try語句塊中,則首先執行finally從句,在執行close()返回。close()沒有返回值,但若finally產生了異常則該異常會傳播給close();
生成器物件還包括乙個send方法,其可以帶乙個引數,該值將成為yield表示式的值(如果把yield看做語句或函式,則該引數就是語句或函式的返回值);
除了next()和send()之外生成器還有乙個throw()方法,如果呼叫這個方法,yield表示式就將引數作為異常拋給throw(),見如下**:
function cf(init)
catch(e)
} }var c = cf(10);
console.log(c.tostring());
console.log(c.next());
console.log(c.send(10));
console.log(c.throw("reset")); //next_v == 10;
console.log(c.next());
//我們可以讓reset稍微優雅點
c.reset = function()
/*but generator is
not defined!!!
注釋中的**會報錯!!!
generator.prototype.reset = function()
*/console.log(c.reset());
javascript語言擴充套件 可迭代物件(4)
js 1.7中還包含乙個陣列推導 array comprehension 的特性,如果不在最後介紹它好像顯得不怎麼完整。陣列推導其實很簡單 let a x x for x in range 0,10 if x 2 0 以上 中的range 返回乙個生成器物件。上述 等價於 let a for x i...
可擴充套件標記語言
可擴充套件標記語言與access,oracle和sql server等資料庫不同,資料庫提供了更強有力的資料儲存和分析能力,例如 資料索引 排序 查詢 相關一致性等,可擴充套件標記語言僅僅是儲存資料。事實上它與其他資料表現形式最大的不同是 可擴充套件標記語言極其簡單,這是乙個看上去有點瑣細的優點,但...
可擴充套件標記語言
xml是可擴充套件標記語言,類似html,用來傳輸和儲存資料。標準通用標記語言的子集,是一種用於標記電子檔案使其具有結構性的標記語言。在電子計算機中,標記指計算機所能理解的資訊符號,通過此種標記,計算機之間可以處理包含各種的資訊比如文章等。xml是樹形結構,且一定要有跟部標籤。語法規則 a.所有的 ...