這篇文章主要為大家展示了“ES6中Generator函數(shù)的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“ES6中Generator函數(shù)的示例分析”這篇文章吧。
網(wǎng)站建設、成都做網(wǎng)站的關注點不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)建站一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。具體如下:
1. 簡介
① 理解:可以把它理解成一個函數(shù)的內部狀態(tài)的遍歷器,每調用一次,函數(shù)的內部狀態(tài)發(fā)生一次改變。
② 寫法:
function* f() {}
③ 作用:就是可以完全控制函數(shù)的內部狀態(tài)的變化,依次遍歷這些狀態(tài)。
④ 運行過程:當調用Generator函數(shù)的時候,該函數(shù)并不執(zhí)行,而是返回一個遍歷器(可以理解成暫停執(zhí)行)。通過調用next()開始執(zhí)行,遇到y(tǒng)ield停止執(zhí)行,返回一個value屬性值為當前yield語句的值,done屬性為false的對象,循環(huán)調用next(),一直執(zhí)行到return語句(如果沒有return語句,就執(zhí)行到函數(shù)結束)。next方法返回的對象的value屬性,就是緊跟在return語句后面的表達式的值(如果沒有return語句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經(jīng)結束。
示例:
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator();//第一次調用該方法不會執(zhí)行,僅返回一個遍歷器。 var a = hw.next(); while(!a.done){ //當執(zhí)行到return 時,a.done=true,終止循環(huán) console.log(a.value+','+a.done); a = hw.next(); } console.log(a.value+','+a.done);
結果:
hello,false world,false ending,true
2. next() 的參數(shù)
① 我們要知道是next()返回一個對象,yield語句本身是沒有返回值,或者說總是返回undefined。next方法可以帶一個參數(shù),該參數(shù)就會被當作上一個yield語句的返回值。
function* f() { for(var i=0; true; i++) { var reset = yield i; console.log(reset); //打印reset,驗證yield語句是沒有返回值的 if(reset) { i = -1; } } } var g = f(); console.log(g.next()) // { value: 0, done: false } console.log(g.next())// { value: 1, done: false } console.log(g.next(true)) // { value: 0, done: false }
結果:
{ value: 0, done: false } undefined { value: 1, done: false } true { value: 0, done: false }
通過next方法的參數(shù),就有辦法在Generator函數(shù)開始運行之后,繼續(xù)向函數(shù)體內部注入值。也就是說,可以在Generator函數(shù)運行的不同階段,從外部向內部注入不同的值,從而調整函數(shù)行為。
②由于next方法的參數(shù)表示上一個yield語句的返回值,所以第一次使用next方法時,不能帶有參數(shù)。V8引擎直接忽略第一次使用next方法時的參數(shù),只有從第二次使用next方法開始,參數(shù)才是有效的。
function* foo(x) { var y = 2 * (yield (x + 1)); var z = yield (y / 3); return (x + y + z); } var it = foo(5); console.log(it.next(3))// { value:6, done:false } console.log(it.next(12))// { value:8, done:false } console.log(it.next(13))// { value:42, done:true }
3. for-of 遍歷generator
for...of循環(huán)可以自動遍歷Generator函數(shù),且此時不再需要調用next方法,
一旦next方法的返回對象的done屬性為true,for...of循環(huán)就會中止,且不包含該返回對象
function *foo() { yield 1; yield 2; yield 3; yield 4; yield 5; return 6; } for (let v of foo()) { console.log(v); } // 1 2 3 4 5
4. yield* 語句
① 如果yield命令后面跟的是一個遍歷器,需要在yield命令后面加上星號,表明它返回的是一個遍歷器。這被稱為yield*語句。
let a = (function* () { yield 'Hello!'; yield 'Bye!'; }()); let b = (function* () { yield 'Greetings!'; yield* a; yield 'Ok, bye.'; }()); for(let value of b) { console.log(value); }
結果:
Greetings! Hello! Bye! Ok, bye.
② yield命令后面如果不加星號,返回的是整個數(shù)組,加了星號就表示返回的是數(shù)組的遍歷器。
function* gen(){ yield* ["a", "b", "c"]; } gen().next() // { value:"a", done:false }
遍歷嵌套數(shù)組:
function* iterTree(tree) { if (Array.isArray(tree)) { for(let i=0; i < tree.length; i++) { yield* iterTree(tree[i]); } } else { yield tree; } } const tree = [ 'a', ['b', 'c'], ['d', 'e'] ]; for(let x of iterTree(tree)) { console.log(x); }// a b c d e
以上是“ES6中Generator函數(shù)的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.rwnh.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前標題:ES6中Generator函數(shù)的示例分析-創(chuàng)新互聯(lián)
文章URL:http://www.rwnh.cn/article34/isose.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、網(wǎng)站收錄、服務器托管、網(wǎng)站維護、品牌網(wǎng)站建設、手機網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)