最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js中Generator函數(shù)的深入講解

 更新時間:2019年04月07日 14:53:12   作者:fsme  
這篇文章主要給大家介紹了關(guān)于js中Generator函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Javascript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

Generator函數(shù)是es6提供的一種異步編程的解決方案,語法行為與傳統(tǒng)函數(shù)完全不一樣。

Generator函數(shù)有多種理解角度,從語法上,首先可以把它理解成,Generator函數(shù)是一個狀態(tài)機(jī),封裝了多個內(nèi)部狀態(tài)。
執(zhí)

行Generator函數(shù)會返回一個遍歷器對象,也就是說,Generator函數(shù)除了是狀態(tài)機(jī)還是一個遍歷器對象生成函數(shù)。 返回遍歷器對象,可以依次遍歷Generator函數(shù)內(nèi)部的每一個狀態(tài)。

下面話不多說了,來一起看看詳細(xì)的介紹吧

語法上

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

形式上

Generator 函數(shù)是一個普通函數(shù),但是有兩個特征。

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

調(diào)用上

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表達(dá)式(或return語句)為止。換言之,Generator 函數(shù)是分段執(zhí)行的,yield表達(dá)式是暫停執(zhí)行的標(biāo)記,而next方法可以恢復(fù)執(zhí)行

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

var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }

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

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

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

調(diào)用 Generator 函數(shù),返回一個遍歷器對象,代表 Generator 函數(shù)的內(nèi)部指針。以后,每次調(diào)用遍歷器對象的next方法,就會返回一個有著value和done兩個屬性的對象。value屬性表示當(dāng)前的內(nèi)部狀態(tài)的值,是yield表達(dá)式后面那個表達(dá)式的值;done屬性是一個布爾值,表示是否遍歷結(jié)束。

yield表達(dá)式

yield表達(dá)式與return語句既有相似之處,也有區(qū)別。相似之處在于,都能返回緊跟在語句后面的那個表達(dá)式的值。區(qū)別在于每次遇到y(tǒng)ield,函數(shù)暫停執(zhí)行,下一次再從該位置繼續(xù)向后執(zhí)行,而return語句不具備位置記憶的功能。一個函數(shù)里面,只能執(zhí)行一次(或者說一個)return語句,但是可以執(zhí)行多次(或者說多個)yield表達(dá)式。正常函數(shù)只能返回一個值,因為只能執(zhí)行一次return;Generator 函數(shù)可以返回一系列的值,因為可以有任意多個yield。從另一個角度看,也可以說 Generator 生成了一系列的值,這也就是它的名稱的來歷(英語中,generator 這個詞是“生成器”的意思)。

語法注意點:

1.yield表達(dá)式只能用在 Generator 函數(shù)里面

2.yield表達(dá)式如果用在另一個表達(dá)式之中,必須放在圓括號里面

3.yield表達(dá)式用作函數(shù)參數(shù)或放在賦值表達(dá)式的右邊,可以不加括號。

例如:

function* demo() {
 foo(yield 'a', yield 'b'); // OK
 let input = yield; // OK
}

next 方法的參數(shù)

yield表達(dá)式本身沒有返回值(就是說let a=yield ;會返回undefined),或者說總是返回undefined。next方法可以帶一個參數(shù),該參數(shù)就會被當(dāng)作上一個yield表達(dá)式的返回值 (注意,是表達(dá)式的返回值,例如 let a=yield.......... 參數(shù)會是a 的值并且會覆蓋表達(dá)式之前的值)。

function* f() {
 for(var i = 0; true; i++) {
 var reset = yield i;
 console.log(reset);
 if(reset) { i = -1; }
 }
}

var g = f();

g.next() 

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • JS全局變量和局部變量最新解析

    JS全局變量和局部變量最新解析

    這篇文章主要介紹了JS全局變量和局部變量最新解析的相關(guān)知識,本文給給大家補充js刪除局部變量的代碼,非常不錯,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • JavaScript QueryString解析類代碼

    JavaScript QueryString解析類代碼

    以前寫的一個解析QueryString的JS類,可以獲取或設(shè)置QueryString中的值,記下了方便找 :)
    2010-01-01
  • javascript中類型判斷的最佳方式

    javascript中類型判斷的最佳方式

    這篇文章介紹了javascript中類型判斷的最佳方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 微信小程序掃描普通二維碼跳轉(zhuǎn)到小程序指定頁面操作方法

    微信小程序掃描普通二維碼跳轉(zhuǎn)到小程序指定頁面操作方法

    這篇文章主要給大家介紹了關(guān)于微信小程序掃描普通二維碼跳轉(zhuǎn)到小程序指定頁面操作的相關(guān)資料,為了分享方便,或者制作宣傳海報之類的,經(jīng)常需要用到微信小程序指定頁面的二維碼,讓用戶掃碼直達(dá)頁面,需要的朋友可以參考下
    2023-08-08
  • javascript設(shè)置文本框光標(biāo)的方法實例小結(jié)

    javascript設(shè)置文本框光標(biāo)的方法實例小結(jié)

    這篇文章主要介紹了javascript設(shè)置文本框光標(biāo)的方法,結(jié)合實例形式總結(jié)分析了javascript針對文本框光標(biāo)的位置、設(shè)置及文本操作的相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • 總結(jié)js中的一些兼容性易錯的問題

    總結(jié)js中的一些兼容性易錯的問題

    下面小編就為大家分享一篇總結(jié)js中的一些兼容性易錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 微信小程序和H5頁面間相互跳轉(zhuǎn)代碼實例

    微信小程序和H5頁面間相互跳轉(zhuǎn)代碼實例

    這篇文章主要介紹了微信小程序和H5頁面間相互跳轉(zhuǎn)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • JavaScript類型系統(tǒng)之正則表達(dá)式

    JavaScript類型系統(tǒng)之正則表達(dá)式

    正則又叫規(guī)則或模式,是一個強(qiáng)大的字符串匹配工具。javascript通過RegExp類型來支持正則表達(dá)式,本文給大家介紹javascript類型系統(tǒng)之正則表達(dá)式,對js正則表達(dá)式相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • 使用Ajax與服務(wù)器(JSON)通信實例

    使用Ajax與服務(wù)器(JSON)通信實例

    本篇文章主要介紹了使用Ajax與服務(wù)器(JSON)通信方法,Ajax提供了兩類服務(wù)器通信手段:同步通信和異步通信。有需要的可以了解一下。
    2016-11-11
  • JS正則表達(dá)式大全(整理詳細(xì)且實用)

    JS正則表達(dá)式大全(整理詳細(xì)且實用)

    JS正則表達(dá)式大全(整理詳細(xì)且實用)。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11

最新評論

金塔县| 全州县| 镶黄旗| 玛曲县| 淄博市| 新龙县| 德江县| 大渡口区| 民和| 桐乡市| 卓尼县| 和田县| 勐海县| 新兴县| 九江县| 含山县| 句容市| 邢台县| 宜良县| 新兴县| 克山县| 屯门区| 石阡县| 方山县| 彭州市| 彰武县| 宜州市| 运城市| 德安县| 和政县| 突泉县| 临沂市| 双柏县| 定州市| 青浦区| 辰溪县| 梁平县| 华池县| 四子王旗| 云梦县| 梓潼县|