基本語法
generator 函式有多種理解角度。首先可以把它理解成,generator 函式是乙個狀態機,封裝了多個內部狀態。
generator 函式是乙個普通函式,但是有幾個特徵。
function關鍵字與函式名之間有乙個星號;
函式體內部使用yield表示式,定義不同的內部狀態(yield在英語裡的意思就是「產出」);
執行 generator 函式會返回乙個遍歷器物件,可呼叫.next方法進行遍歷, 遍歷的結果是generator函式裡面通過yield或是return定義的值,按順序輸出
generator 函式的呼叫方法與普通函式一樣,也是在函式名後面加上一對圓括號。不同的是,呼叫 generator 函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件(如下圖),也就是上一章介紹的遍歷器物件(iterator object)。
下一步,必須呼叫遍歷器物件的next方法,使得指標移向下乙個狀態。每次呼叫next方法,內部指標從函式頭部或上一次停下來的地方開始執行,直到遇到下乙個yield表示式(或return語句)為止。
function
*bar()
//呼叫了生成器函式,函式並麼有執行,返回了乙個迭代器物件
let iterator=
bar();
console.
log(iterator.
next()
);console.
log(iterator.
next()
);console.
log(iterator.
next()
.value)
;
yield表示式
1)遇到yield表示式,就暫停執行後面的操作,並將緊跟在yield後面的那個表示式的值,作為返回的物件的value屬性值。
2)下一次呼叫next方法時,再繼續往下執行,直到遇到下乙個yield表示式。
3)如果沒有再遇到新的yield表示式,就一直執行到函式結束,直到return語句為止,並將return語句後面的表示式的值,作為返回的物件的value屬性值。結束遍歷
4)如果該函式沒有return語句,則返回的物件的value屬性值為undefined。
function
*foo()
function
*bar()
let iterator=
bar();
for(
let value of iterator)
//function
foo(
)function
*bar()
let iterator=
bar();
console.
log(iterator.
next()
);console.
log(iterator.
next()
);return
yield
//都可以返回語句之後的那個值,一樣的。但是return之後就無法取值,不一樣的地方
next傳引數// next方法可以帶乙個引數,該引數可以被當作上乙個yield語句的返回值
function
*foo()
let iterator=
foo();
console.
log(iterator.
next(2
)); console.
log(iterator.
next(3
));
return 方法//返回的引數 並且遍歷結束遍歷
//沒有給引數返回就為未定義
function
*foo()
let iterator=
foo();
console.
log(iterator.
next()
);console.
log(iterator.
return
("結束"))
; console.
log(iterator.
next()
);
throwletg=
function*(
)catch
(e)finally
}let iterator=g(
);iterator.
next()
;
Python學習筆記 生成器(Generator)
python學習筆記 生成器 generator 擁有迭代序列的一致方式,比如列表裡的物件或檔案裡的行,是python的一項重要特性。這是通過迭代器協議的方式來完成的,一種生成可迭代物件的通用方式。例如,迭代乙個字典會生成字典鍵構成的集合。當我們書寫for key in mydict語句時,pyth...
6 生成器模式 builder
將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。builder 生成器介面,定義建立乙個product物件所需的各個部件的操作。concretebuilder 具體的生成器實現,實現各個部件的建立,並負責組裝product物件的各個部件,同時還提供乙個讓使用者獲取組裝完成後...
JS之ES6生成器
generator 生成器 是 es6 標準引入的新的資料型別。乙個 generator 看上去像乙個函式,但可以返回多次。generator 函式和普通的函式區別有兩個,1 function 和函式名之間有乙個 號,2 函式體內部使用了 yield 表示式 呼叫生成器函式和呼叫 普通函式不同,呼叫...