ES6標準入門之Generator函式(基礎篇)

2021-09-24 08:10:48 字數 1652 閱讀 1423

從語法上來講,可以將它理解成狀態機,封裝了多個內部狀態。

generator函式是es6提供的一種非同步程式設計解決方案,語法與傳統函式完全不同。 執行generator函式會返回乙個遍歷器物件。 返回的遍歷器物件可以依次遍歷generator函式內部的每乙個狀態。

function* generator () 

var hw = generator();

複製**

函式並不執行,返回的是指向內部狀態的指標物件。 如何執行?

hw.next();

複製**

這個next()底層是什麼樣的呢?

function

makenext(array) :}}}

let makenext = makenext(['a','b']);

makenext.next();

複製**

執行時,遇到yield就暫停,返回的物件包括value和done兩個屬性。 value是yield語句後面表示式的值,done後為布林型別的值。 最後一次呼叫next()方法,返回的是.

那就程式設計的單純的暫緩執行函式

function* fn() 

var f= fn();

settimeout(function() ,2000)

複製**

很方便有沒有! 不過,普通函式不能用yield,用了也報錯。 當然,表示式中用的時候,也要加括號。

function* fn() 

複製**

當然了,用在函式引數中和賦值語句的右邊,是不用加括號的。

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

function* fn (x) 

var f = fn(5);

f.next();

f.next();

f.next();

var ff = fn(5);

ff.next();

ff.next(12);

ff.next(13);

複製**

for...of迴圈可以自動遍歷generator函式生成的遍歷器物件,且此時不再需要呼叫next方法。

function* fn() 

for(let v of fn())

//1 2 3 4

複製**

為啥沒有5? 原來,一旦next方法返回的物件的done屬性為true,for...of迴圈就會終止,且不包括該返回的物件。

function* fibonacci() 

}for(let i of fibonacci())

複製**

function* loadui () 

var load = loadui();

//載入

load.next();

//隱藏

load.next();

複製**

充分利用暫停執行的效果,雖然沒在**中真正實現過,但是屬實好用呀!!! 就到這....

ES6標準入門 6 陣列的擴充套件

擴充套件運算子 spread 例子1 es5 的寫法 function f x,y,z let args 0,1,2 es6 的寫法 f args 例子2 es5 的寫法 let arr1 0,1,2 let arr2 3,4,5 es6 的寫法 arr1.push arr2 與解構賦值結合 函式的...

《ES6標準入門》 字串擴充套件

感覺暫時用不到,手動忽略。兩者都是返回字串給定位置的字元 charat es5語法,不支援unicode編號大於0xffff的字元 at es7語法,支援unicode編號大於0xffff的字元。abc charat 0 a abc at 0 a 傳統js語法 indexof 傳統js語法,返回指定...

《ES6標準入門》(一)let和const

一 let命令 1 let的作用域只在 塊內,塊外無效 var全域性有效 var a for var i 0 i 10 i a 6 對於這段 變數i是var宣告的,在全域性範圍內有效,所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i值 如果使用let,宣告的變數僅在塊級作用域內有效...