1、generator 函式是 es6 提供的一種非同步程式設計解決方案。形式上,generator 函式是乙個普通函式,但是有兩個特徵。一是,function
關鍵字與函式名之間有乙個星號;二是,函式體內部使用yield
語句,定義不同的內部狀態。
2、generator函式的呼叫方法與普通函式一樣,也是在函式名後面加上一對圓括號。不同的是,呼叫generator函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件,也就是上一章介紹的遍歷器物件(iterator object)。
3、必須呼叫遍歷器物件的next方法,使得指標移向下乙個狀態。也就是說,每次呼叫next
方法,內部指標就從函式頭部或上一次停下來的地方開始執行,直到遇到下乙個yield
語句(或return
語句)為止。換言之,generator函式是分段執行的,yield
語句是暫停執行的標記,而next
方法可以恢復執行。
4、總結一下,呼叫generator函式,返回乙個遍歷器物件,代表generator函式的內部指標。以後,每次呼叫遍歷器物件的next
方法,就會返回乙個有著value
和done
兩個屬性的物件。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
句本身沒有返回值,或者說總是返回undefined
。next
方法可以帶乙個引數,該引數就會被當作上乙個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命令宣告的常量也是不提公升,同樣存在暫時性死...