javascript語言擴充套件 可迭代物件(3)

2021-09-23 21:23:17 字數 1341 閱讀 7257

任何使用關鍵字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.所有的 ...