国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

切圖崽的自我修養(yǎng)-[ES6] 生成器Generator淺析

mj / 750人閱讀

摘要:搞這么神秘其實(shí)就是個(gè)迭代器的核心實(shí)際上就是一個(gè),通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個(gè)道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí)

Generator

搞這么神秘 其實(shí)就是個(gè)迭代器

Generator的核心實(shí)際上就是一個(gè)Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過next來對這些執(zhí)行片段進(jìn)行遍歷. 這和遍歷array,set,map這些數(shù)據(jù)結(jié)構(gòu)是一個(gè)道理.只不過generator用來遍歷函數(shù)片段,而array/set/map 用來遍歷元素.

對生成器執(zhí)行next()操作,進(jìn)行生成器的入口開始執(zhí)行代碼

執(zhí)行到第一個(gè)yield時(shí),向調(diào)用者返回一個(gè)值,并將函數(shù)掛起;

掛起時(shí),函數(shù)當(dāng)前的執(zhí)行上下文環(huán)境和參數(shù)被保存下來;

執(zhí)行到第二個(gè)yield時(shí),參數(shù)從掛起狀態(tài)被重新調(diào)用,進(jìn)入上次掛起的執(zhí)行上下文環(huán)境繼續(xù)下面的操作,到下一個(gè)yield操作時(shí)重復(fù)上面的過程

執(zhí)行過程解析
    function *generator() {
      console.log(1);
      var x = (yield 2) +3
      console.log(3);
        var y = yield 4;
    }

    var g = generator(); 
    console.log(g.next());
    console.log(g.next());
    console.log(g.next());
    console.log(g.next());
    

var g = generator() 這一句毛都不會輸出,實(shí)際上這句話執(zhí)行完之后,generator()形成了內(nèi)存泄漏狀態(tài),因?yàn)楹瘮?shù)體內(nèi)部的對象被外部全局變量(g)所引用,導(dǎo)致generator()無法被回收. 這一句執(zhí)行完后實(shí)際上 g = {next:function(){xxxxxx}},

第一個(gè)g.next()會執(zhí)行console.log(1),向下執(zhí)行到y(tǒng)ield關(guān)鍵字,將{value:2,done:false}返回給外部,然后掛起當(dāng)前函數(shù)

第二個(gè)g.next()會執(zhí)行 (yield 2)+3 的操作,會執(zhí)行把 (yield 2)+3 賦值給x的操作, 會執(zhí)行console.log(3)的操作,向下執(zhí)行到y(tǒng)ield關(guān)鍵字,把{value:4,done:false}返回給外部,掛起當(dāng)前函數(shù).

第三個(gè)g.next()會執(zhí)行把(yield 4)賦值給y的操作,向下掃描執(zhí)行,沒有發(fā)現(xiàn)有yield或者return了,這時(shí)候會throw一個(gè)stopIterator的異常,表示在這之后已經(jīng)沒有yield或者return語句可以迭代了,于是把done值置為true. 返回{value:undefined,done:true}

第四個(gè)g.next()同理,返回{value:undefined,done:true}

    function *generator(z) {
      console.log(1);
      var x = (yield 2) +z
      console.log(x);
      console.log(3);
        var y = yield 4;
        console.log(y)
    }

    var g = generator(5); 
    console.log(g.next(7)); 
    console.log(g.next(8));
    console.log(g.next(9));
    console.log(g.next(10));
    

var g = generator(5)這一句毛都不輸出,實(shí)際上這句話執(zhí)行完之后,generator()形成了內(nèi)存泄漏狀態(tài),因?yàn)楹瘮?shù)體內(nèi)部的對象被外部全局變量(g)所引用,導(dǎo)致generator()無法被回收. 這一句執(zhí)行完后實(shí)際上 g = {next:function(){xxxxxx}}, 且函數(shù)體內(nèi)的z參數(shù)被初始化成5.

第一個(gè)g.next(7)進(jìn)入函數(shù),會執(zhí)行console.log(1),向下執(zhí)行掃描到了yield關(guān)鍵字,于是將{value:2,done:false}返回給外部,然后掛起當(dāng)前函數(shù)

第二個(gè)g.next(8)從上次掛起的地方進(jìn)入函數(shù),會執(zhí)行 把next的參數(shù)8賦值給(yield 2)的操作, 會執(zhí)行 (yield 2)+z 的操作, 會執(zhí)行 把(yield 2)+z的結(jié)果賦值給x的操作, 會執(zhí)行console.log(x)的操作,會執(zhí)行console.log(3)的操作,繼續(xù)向下執(zhí)行掃描到了yield關(guān)鍵字,于是將{value:4,done:false}返回給外部,然后掛起當(dāng)前函數(shù)

第三個(gè)g.next(9)從上次掛起的地方進(jìn)入函數(shù),會執(zhí)行把next的參數(shù)9賦值給(yield 4)操作,會執(zhí)行把(yield 4)賦值給y的操作,會執(zhí)行console.log(y)的操作. 然后把向下執(zhí)行掃描,沒有發(fā)現(xiàn)有yield或者return了,這時(shí)候會throw一個(gè)stopIterator的異常,表示在這之后已經(jīng)沒有yield或者return語句可以迭代了,于是把done值置為true. 返回{value:undefined,done:true},然后掛起當(dāng)前函數(shù)

第四個(gè)g.next(10)從上次掛起的地方進(jìn)入函數(shù),也是同理,返回{value:undefined,done:true},然后掛起當(dāng)前函數(shù)

相關(guān)參考

由于Iterator/Generator無一例外的都涉及到了javascript函數(shù)從創(chuàng)建到執(zhí)行到銷毀的過程, 涉及到了 執(zhí)行上下文EC/活動(dòng)對象AO/變量對象VO/內(nèi)存泄漏/回收機(jī)制 等核心概念,東西多且較復(fù)雜,有興趣的同學(xué)可以參考湯姆大叔深入理解JavasSript系列, 里面有對javascript的核心(函數(shù)/原型鏈)等做了詳盡的介紹.

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80206.html

相關(guān)文章

  • 切圖崽的自我修養(yǎng)-[ES6] 成器Generator淺析

    摘要:搞這么神秘其實(shí)就是個(gè)迭代器的核心實(shí)際上就是一個(gè),通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個(gè)道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí) Generator 搞這么神秘 其實(shí)就是個(gè)迭代器 Generator的核心實(shí)際上就是一個(gè)Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全...

    Dogee 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 成器Generator淺析

    摘要:搞這么神秘其實(shí)就是個(gè)迭代器的核心實(shí)際上就是一個(gè),通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個(gè)道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí) Generator 搞這么神秘 其實(shí)就是個(gè)迭代器 Generator的核心實(shí)際上就是一個(gè)Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全...

    李義 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 迭代器Iterator淺析

    摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個(gè)數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個(gè)指針對象,指向當(dāng)前數(shù)組的起始位置。 Iterator 這真是毅種循環(huán) Iterator不是array,也不是set,不是map, 它不是一個(gè)實(shí)體,而是一種訪問機(jī)制,是一個(gè)用來訪問某個(gè)對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Ite...

    neu 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 迭代器Iterator淺析

    摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個(gè)數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個(gè)指針對象,指向當(dāng)前數(shù)組的起始位置。 Iterator 這真是毅種循環(huán) Iterator不是array,也不是set,不是map, 它不是一個(gè)實(shí)體,而是一種訪問機(jī)制,是一個(gè)用來訪問某個(gè)對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Ite...

    springDevBird 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 迭代器Iterator淺析

    摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個(gè)數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個(gè)指針對象,指向當(dāng)前數(shù)組的起始位置。 Iterator 這真是毅種循環(huán) Iterator不是array,也不是set,不是map, 它不是一個(gè)實(shí)體,而是一種訪問機(jī)制,是一個(gè)用來訪問某個(gè)對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Ite...

    happyfish 評論0 收藏0

發(fā)表評論

0條評論

mj

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<