從語法上來講,可以將它理解成狀態機,封裝了多個內部狀態。
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,宣告的變數僅在塊級作用域內有效...