成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript的Generator理解使用

seal_de / 505人閱讀

摘要:返回的遍歷器對象,可以依次遍歷函數(shù)內(nèi)部的每一個狀態(tài)。下一步,必須調(diào)用遍歷器對象的方法,使得指針移向下一個狀態(tài)。從語義上講,第一個方法用來啟動遍歷器對象,所以不用帶有參數(shù)。

Generator理解

Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,可以這么理解:

從語法上,首先可以把它理解成,Generator 函數(shù)是一個狀態(tài)機,封裝了多個內(nèi)部狀態(tài)。
執(zhí)行 Generator 函數(shù)會返回一個遍歷器對象,也就是說,Generator 函數(shù)除了狀態(tài)機,還是一個遍歷器對象生成函數(shù)。返回的遍歷器對象,可以依次遍歷 Generator 函數(shù)內(nèi)部的每一個狀態(tài)。

形式上,Generator 函數(shù)是一個普通函數(shù),但是有兩個特征。一是,function關(guān)鍵字與函數(shù)名之間有一個星號;二是,函數(shù)體內(nèi)部使用yield表達式,定義不同的內(nèi)部狀態(tài)(yield在英語里的意思就是“產(chǎn)出”)。

function* helloWorldGenerator() {
  yield "hello";
  yield "world";
  return "ending";
}

var hw = helloWorldGenerator();

Generator 函數(shù)的調(diào)用方法與普通函數(shù)一樣,也是在函數(shù)名后面加上一對圓括號。不同的是,調(diào)用 Generator 函數(shù)后,該函數(shù)并不執(zhí)行,返回的也不是函數(shù)運行結(jié)果,而是一個指向內(nèi)部狀態(tài)的指針對象,也就是上一章介紹的遍歷器對象(Iterator Object)。
下一步,必須調(diào)用遍歷器對象的next方法,使得指針移向下一個狀態(tài)。也就是說,每次調(diào)用next方法,內(nèi)部指針就從函數(shù)頭部或上一次停下來的地方開始執(zhí)行,直到遇到下一個yield表達式(或return語句)為止。換言之,Generator 函數(shù)是分段執(zhí)行的,yield表達式是暫停執(zhí)行的標記,而next方法可以恢復(fù)執(zhí)行。

hw.next()
// { value: "hello", done: false }

hw.next()
// { value: "world", done: false }

hw.next()
// { value: "ending", done: true }

hw.next()
// { value: undefined, done: true }

上面的程序執(zhí)行了四次next:

第一次調(diào)用,Generator 函數(shù)開始執(zhí)行,直到遇到第一個yield表達式為止。next方法返回一個對象,它的value屬性就是當前yield表達式的值hello,done屬性的值false,表示遍歷還沒有結(jié)束。

第二次調(diào)用,Generator 函數(shù)從上次yield表達式停下的地方,一直執(zhí)行到下一個yield表達式。next方法返回的對象的value屬性就是當前yield表達式的值world,done屬性的值false,表示遍歷還沒有結(jié)束。

第三次調(diào)用,Generator 函數(shù)從上次yield表達式停下的地方,一直執(zhí)行到return語句(如果沒有return語句,就執(zhí)行到函數(shù)結(jié)束)。next方法返回的對象的value屬性,就是緊跟在return語句后面的表達式的值(如果沒有return語句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經(jīng)結(jié)束。

第四次調(diào)用,此時 Generator 函數(shù)已經(jīng)運行完畢,next方法返回對象的value屬性為undefined,done屬性為true。以后再調(diào)用next方法,返回的都是這個值。

yield認識

由于 Generator 函數(shù)返回的遍歷器對象,只有調(diào)用next方法才會遍歷下一個內(nèi)部狀態(tài),所以其實提供了一種可以暫停執(zhí)行的函數(shù)。yield表達式就是暫停標志。

(1)遇到y(tǒng)ield表達式,就暫停執(zhí)行后面的操作,并將緊跟在yield后面的那個表達式的值,作為返回的對象的value屬性值。

(2)下一次調(diào)用next方法時,再繼續(xù)往下執(zhí)行,直到遇到下一個yield表達式。

(3)如果沒有再遇到新的yield表達式,就一直運行到函數(shù)結(jié)束,直到return語句為止,并將return語句后面的表達式的值,作為返回的對象的value屬性值。

(4)如果該函數(shù)沒有return語句或者執(zhí)行完return之后再運行next的時候,則返回的對象的value屬性值為undefined,done為true。
需要注意,yield表達式只能用在 Generator 函數(shù)里面,用在其他地方都會報錯。
yield表達式如果用在另一個表達式之中,必須放在圓括號里面
yield表達式用作函數(shù)參數(shù)或放在賦值表達式的右邊,可以不加括號。
yield放在表達式中的時候,let s =(yield 1+2),s其值將會是undefined,而1+2這個等于3的值將會作為next返回對象的value的值

next方法

yield表達式本身沒有返回值,或者說總是返回undefined。next方法可以帶一個參數(shù),該參數(shù)就會被當作上一個yield表達式的返回值。

這個參數(shù)就是解決了上面說的注意事項的最后一個,yield的返回值總是undefined,

由于next方法的參數(shù)表示上一個yield表達式的返回值,所以在第一次使用next方法時,傳遞參數(shù)是無效的。V8 引擎直接忽略第一次使用next方法時的參數(shù),只有從第二次使用next方法開始,參數(shù)才是有效的。從語義上講,第一個next方法用來啟動遍歷器對象,所以不用帶有參數(shù)。

yield* 表達式

如果在 Generator 函數(shù)內(nèi)部,調(diào)用另一個 Generator 函數(shù),默認情況下是沒有效果的。
這個就需要用到y(tǒng)ield*表達式,用來在一個 Generator 函數(shù)里面執(zhí)行另一個 Generator 函數(shù)。

function* inner() {
  yield "hello!";
}

function* outer1() {
  yield "open";
  yield inner();
  yield "close";
}

var gen = outer1()
gen.next().value // "open"
gen.next().value // 返回一個遍歷器對象
gen.next().value // "close"

function* outer2() {
  yield "open"
  yield* inner()
  yield "close"
}

var gen = outer2()
gen.next().value // "open"
gen.next().value // "hello!"
gen.next().value // "close"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88924.html

相關(guān)文章

  • 理解javascript中異步編程Generator

    摘要:是處理異步編程的一種方式,來看看和有什么不同或獲取值再來看看函數(shù),函數(shù)前面是一個然后是函數(shù)名,函數(shù)體里面是用代表但是可以返回多次使用即不處理后面的返回的是一個對象的寫法更像是同步的語句,比更簡潔獲取值的幾種方式調(diào)用可以使用獲取值表示為最后一 Generator 是es6處理異步編程的一種方式,來看看和promise有什么不同 const myFirstPromise = new Pro...

    williamwen1986 評論0 收藏0
  • 夯實基礎(chǔ)-JavaScript異步編程

    摘要:調(diào)用棧被清空,消息隊列中并無任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時間點請求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊列任務(wù)。請求并發(fā)回調(diào)函數(shù)執(zhí)行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎(chǔ)中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會執(zhí)行下一段代碼,這種方式...

    shadowbook 評論0 收藏0
  • Javascript異步編程:Callback、Promise、Generator

    摘要:異步過程控制了解異步的意義之后,我們來對比目前主流幾種異步過程控制方法,探討一下異步編程的最佳實踐。結(jié)語希望本文對大家有點幫助,能更深刻的理解異步編程,能寫出更優(yōu)雅更高效的代碼。 同步和異步(Synchronous and Asynchronous) 了解javascript的同學(xué)想必對同步和異步的概念應(yīng)該都很熟悉了,如果還有不熟悉的同學(xué),我這里舉個形象的例子,比如我們早上起床后要干三...

    dadong 評論0 收藏0
  • ES6學(xué)習(xí)筆記之Generator函數(shù)

    摘要:調(diào)用函數(shù)后和普通函數(shù)不同的是,該函數(shù)并不立即執(zhí)行,也不返回函數(shù)執(zhí)行結(jié)果,而是返回一個指向內(nèi)部狀態(tài)的對象,也可以看作是一個遍歷器對象。第一個只是用來啟動函數(shù)內(nèi)部的遍歷器,傳參也沒有多大意義。 之前斷斷續(xù)續(xù)接觸到了一些ES6的知識,異步編程方面聽得比較多的就是Promise,直到最近比較系統(tǒng)地學(xué)習(xí)了ES6的新特性才發(fā)現(xiàn)Generator這個神奇的存在,它可以實現(xiàn)一些前所未有的事情,讓我頓時...

    cjie 評論0 收藏0
  • JavascriptGenerator函數(shù)和yield關(guān)鍵字

    摘要:序在中,大家討論的最多的就是異步編程的操作,如何避免回調(diào)的多次嵌套。今天所講的和就是和異步編程有關(guān),可以幫助我們把異步編程同步化。然而這樣的方法依然需要依賴外在的庫函數(shù),于是中提出了和關(guān)鍵字。 序 在Javascript中,大家討論的最多的就是異步編程的操作,如何避免回調(diào)的多次嵌套。異步操作的回調(diào)一旦嵌套很多,不僅代碼會變的臃腫,還很容易出錯。各種各樣的異步編程解決方案也被不斷提出,例...

    ZHAO_ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<