js ES6學習筆記 Generator函式

2022-09-05 21:48:29 字數 1873 閱讀 3111

1、generator 函式是 es6 提供的一種非同步程式設計解決方案。形式上,generator 函式是乙個普通函式,但是有兩個特徵。一是,function關鍵字與函式名之間有乙個星號;二是,函式體內部使用yield語句,定義不同的內部狀態。

2、generator函式的呼叫方法與普通函式一樣,也是在函式名後面加上一對圓括號。不同的是,呼叫generator函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件,也就是上一章介紹的遍歷器物件(iterator object)。

3、必須呼叫遍歷器物件的next方法,使得指標移向下乙個狀態。也就是說,每次呼叫next方法,內部指標就從函式頭部或上一次停下來的地方開始執行,直到遇到下乙個yield語句(或return語句)為止。換言之,generator函式是分段執行的,yield語句是暫停執行的標記,而next方法可以恢復執行。

4、總結一下,呼叫generator函式,返回乙個遍歷器物件,代表generator函式的內部指標。以後,每次呼叫遍歷器物件的next方法,就會返回乙個有著valuedone兩個屬性的物件。value屬性表示當前的內部狀態的值,是yield語句後面那個表示式的值;done屬性是乙個布林值,表示是否遍歷結束。

5、乙個函式裡面,只能執行一次(或者說乙個)return語句,但是可以執行多次(或者說多個)yield語句。正常函式只能返回乙個值,因為只能執行一次return;generator函式可以返回一系列的值,因為可以有任意多個yield

6、由於generator函式就是遍歷器生成函式,因此可以把generator賦值給物件的symbol.iterator屬性,從而使得該物件具有iterator介面。

var myiterable ={};

myiterable[symbol.iterator] = function*() ;

[...myiterable]

//[1, 2, 3]

7、yield句本身沒有返回值,或者說總是返回undefinednext方法可以帶乙個引數,該引數就會被當作上乙個yield語句的返回值。

8、下面是乙個利用generator函式和for...of迴圈,實現斐波那契數列的例子。

function*fibonacci() 

}for

(let n of fibonacci())

9、除了for...of迴圈以外,擴充套件運算子(...)、解構賦值和array.from方法內部呼叫的,都是遍歷器介面。這意味著,它們都可以將generator函式返回的iterator物件,作為引數。

function*numbers () 

//擴充套件運算子

[...numbers()] //

[1, 2]

方法array.from(numbers()) //

[1, 2]

//解構賦值

let [x, y] =numbers();

x //

1y //2//

for...of 迴圈

for(let n of numbers()) //1

//2

js ES6學習筆記 Proxy

1 proxy 用於修改某些操作的預設行為,等同於在語言層面做出修改,所以屬於一種 元程式設計 meta programming 即對程式語言進行程式設計。2 proxy 可以理解成,在目標物件之前架設一層 攔截 外界對該物件的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾...

js ES6學習筆記 Reflect

1 reflect物件與proxy物件一樣,也是 es6 為了操作物件而提供的新 api。reflect物件的設計目的有這樣幾個。2 reflect.get方法查詢並返回target物件的name屬性,如果沒有該屬性,則返回undefined。3 reflect.set方法設定target物件的na...

js ES6學習筆記 const命令

1 const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。2 const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。3 const的作用域與let命令相同 只在宣告所在的塊級作用域內有效。4 const命令宣告的常量也是不提公升,同樣存在暫時性死...