一步,一步前進の一步
es6深入淺出之generator生成器。本人對生成器的印象是語法難以理解,又沒有什麼實際的應用場景。為啥要學習一下呢?可能未來某些高階的業務會用到,還有萬一面試官問的話,我得能侃幾句,顯得我牛。
定義generator 是為非同步而生,正常的函式是一進入就必須執行完成的,而 generator 可以多次暫停,讓出控制權。
語法學習 generator 語法,你需要了解function* 、yield、next三個基本概念。
function* 用來宣告乙個函式是生成器函式,它比普通的函式宣告多了乙個*,*的位置比較隨意可以挨著 function 關鍵字,也可以挨著函式名,看個人喜好。
yield 產出的意思,這個關鍵字只能出現在生成器函式體內,但是生成器中也可以沒有 yield 關鍵字,函式遇到 yield 的時候會暫停,並把 yield 後面的表示式結果丟擲去。
next作用是將**的控制權交還給生成器函式。
// 宣告生成器函式 function* generator() // 獲取生成器物件 let g = generator(); // 第乙個 next(),首次啟動生成器 g.next(); // // 喚醒被 yield 暫停的狀態 g.next(); //
讀完上面的**有沒有感覺生成器好像個又懶又胖的人,每次必須推他一下才會走一點點,直到盡頭。我對生成器的誤解,生成器可能實際上超級屌的。
當然,生成器和迭代器有點曖昧的關係,好像生成器就是迭代器,還沒有仔細學習過 iterator,在此不展開,自行了解。
yield next 生成器內外勾結
上面的**片段,我們知道了 next()的返回值的 value部分就是 yield 後面的表示式。實際上 next()也可以向生成器內部傳遞某些資料。
function* generator(txt) let g = generator('你是誰?'); console.log('對話開始~~'); // 1 let step01 = g.next(); console.log(step01.value);// 3 g.next('歡迎打賞'); console.log('對話結束~~'); // 5
來來一圖勝千言,我做了乙個並不嚴謹的 low 圖,真醜啊。對不對我也不能保證。
需要注意的一點是,第乙個 next()只是為了啟動生成器,如果你嘗試給此處的它傳遞點東西是沒用的。
通過上圖,希望讀到這裡的小夥伴理解了生成器的執行流程以及 yield 和 next 是如何相互傳遞資料的。
generator 結合非同步處理
開篇也說,generator 是為了非同步而生的,那我們就簡單看下如何進行非同步處理。額,其實 async await 已經很完美了。
function* gen () let g = gen() let result = g.next() result .value .then(function (data) ) .then(function (data) ) g.next();
寫到這裡有點感悟,普通函式一旦執行,函式外部是無法干預函式體內部的流程的只能等函式執行完成,而生成器函式通過 yield 和 next 相互傳遞資料可以控制函式體內的**流程,突然感覺 generator 並不是一無是處呢~。非同步**參考了promise,generator(生成器),async(非同步)函式
深入淺出es6(箭頭函式)
是function的簡寫形式,支援expression和statement兩種形式。同時一點很重要的時是他擁有詞法作用域this值,幫助你很好的解決this的指向問題,這是乙個很酷的方式,可以幫助你減少一些 的編寫,先來看看它的語法。var arr 1,2,3 arr.map item item 1...
《ES6深入淺出》學習筆記 三
解構 destructuring 通常來說,你很可能這樣訪問陣列中的前三個元素 var first somearray 0 var second somearray 1 var third somearray 2 如果使用解構賦值的特性,將會使等效的 變得更加簡潔並且可讀性更高 陣列與迭代器的解構 ...
深入淺出ES6之let和const命令
let和const宣告的變數只在 塊內有效 a referenceerror a is not defined.b 1 不存在變數提公升 變數一定要在宣告後使用,否則報錯 var tmp 123 if true 不允許重複宣告 報錯 function 塊級作用域 function f functio...