關於generator函式,說實話還是不徹底的明白其意義以及相應的某些應用場景,在此只是針對目前個人境界理解程度,對其進行一次重新的記錄。
一、基本概念
關於generator函式,我就利用es6此書上的比喻來形容。
generator它是乙個狀態機,其內部封裝了很多很多待處理的狀態(yiled code...
【待處理狀態之一】),它有三個功能鍵,分別是.next()
【開始處理下乙個待處理狀態】、.return()
【直接return結束整個狀態處理操作】、.throw()
【丟擲異常】。
對於generator函式執行.next()方法時,會返回乙個有著value和done兩個屬性的物件。value屬性表示當前的內部狀態的值,是yield表示式後面那個表示式的值;done屬性是乙個布林值,表示是否遍歷結束【false未遍歷完畢,true已遍歷完畢】。
注意:generator返回的是個遍歷器對物件iterator,而不是建構函式,所以不可直接通過new來建立所對應的generator例項來。
二、yield表示式
1、它本身只是個暫停標識關鍵字,所以單獨得yiled會返回undefined,若其後存在暫緩操作code,則其返回值為其後code的返回值。
2、yield只適用於generator函式,簡單來說,只能在generator函式中使用,其他使用場景報錯。
3、在generator函式中,當其他表示式需要使用yield時,必須將其和其後的表示式用圓括號包起來比如:console.log('hello' + (yield 123))
,不然報錯。
三、與iterator介面的關係
1、構造物件自定義iterator介面,因為上述基本概念得知,generator函式返回的是乙個iterator遍歷器物件,所以我們可以將其與symbol.iterator配合從而構造物件自定義iterator介面(遍歷器)。比如:
const obj =
newproxy(,
)// 布置自定義iterator介面
reflect.
set(obj, symbol.iterator,
function*(
)})console.
log(
[...obj]
)// ["first", "second", "暫無資料"]
四、generator與for…of迴圈
首先我們都知道for...of
是部署有iterator
介面的資料結構專屬特性,那麼為什麼for...of
只是針對存在iterator
介面的資料結構體有作用呢?
首先得要說明一點,for...of
針對的不是部署有iterator
介面的資料結構,而是iterator
介面本身,也就是遍歷器物件。證明如下:
const
test
=function*(
)for
(const item of
test()
)
那為什麼沒有列印 4 呢?
首先我們得了解,當我們使用for...of
時,它會自動尋找例項中的遍歷器物件,從而自動遍歷例項物件,而不需要.next()
一步一步手動執行。
ok,這是了解for...of
迴圈的前提,現在我麼來說說它是以什麼來判斷遍歷的結束。我們得知道每個遍歷器物件.next()
返回值是什麼?
const
test
=function*(
)const test =
test()
console.
log(test.
next()
)//
console.
log(test.
next()
)//
console.
log(test.
next()
)// `在這裡插入**片`
console.
log(test.
next()
)//
我們可以知道唯獨沒有被for..of
遍歷出的 4 的相應的.next()
返回值中的done
是true,ok,那我們就可以得知.next()
方法返回的是乙個包含yield
尾部語句返回值和乙個識別符號done
,而done
的作用則是表明例項物件是否遍歷完畢,當done
為true時表示遍歷完畢並且不會向for...of
返回其value值。
五、generator三大api方法【在這裡只說說.next()
的乙個注意事項】
1、.next()
首先不用多說它的作用了吧,待會顯得我囉嗦,哈哈哈。
注意點:.next()函式的引數是上乙個yield後語句的返回值,若下乙個yield依賴上乙個yield就需要將值作為引數傳給.next()函式。
const
test
=function*(
)const test =
test()
console.
log(test.
next()
)//
console.
log(test.
next()
)//
console.
log(test.
next()
)//
console.
log(test.
next()
)//
這是不加引數的結果,因為當第二個yield依賴第乙個yield的結果,但是第二個.next()執行時,並不知道firstyield是個什麼東西,所以返回結果為,下面類似道理。
const
test
=function*(
)const test =
test()
console.
log(test.
next()
)//
console.
log(test.
next(1
))// console.
log(test.
next(2
))// console.
log(test.
next()
)//
這是加了引數的結果。 16 1 0 generator函式的語法
一 generator是es6提供的一種非同步程式設計解決方案,執行語法跟傳統函式完全不同 二 1 語法上看,理解成乙個狀態機,封裝了多個內部狀態 2 形式上看,generator是乙個普通的函式,但是具備2個特徵 a 星號 b 函式體內可以使用多個yield語句定義不同的內部狀態 三 1 執行ge...
Generator函式的語法和應用
基本概念 狀態機,封裝了多個內部狀態 返回乙個遍歷器物件,通過改物件可以一次遍歷generator函式內部的每乙個狀態 帶 號,yeild表示式定義不同的內部狀態 呼叫 generator 函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件,也就是遍歷器物件 gener...
迭代函式 Generator函式的理解
一 基本用法 generator函式跟普通函式在寫法上的區別就是,多了乙個星號 並且只有在generator函式中才能使用yield 什麼是yield呢,他相當於generator函式執行的中途暫停點,比如下方有3個暫停點。而怎麼才能暫停後繼續走呢?那就得使用到next方法,next方法執行後會返回...