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

資訊專欄INFORMATION COLUMN

javascript中閉包的一些理解

lansheng228 / 1054人閱讀

摘要:眾所周知,閉包的一個(gè)作用就是讓一些變量始終保持在內(nèi)存中,在此我用一些實(shí)際代碼對(duì)這句話作進(jìn)一步的理解。輸出這個(gè)很好理解,不多說(shuō)輸出輸出上述代碼中,就是執(zhí)行函數(shù)返回的匿名函數(shù)。

閉包是javascript中繞不開(kāi)的話題,關(guān)于閉包的一些概念和應(yīng)用,這方面資料比較多,在此就不再贅述。眾所周知,閉包的一個(gè)作用就是 讓一些變量始終保持在內(nèi)存中 ,在此我用一些實(shí)際代碼對(duì)這句話作進(jìn)一步的理解。

demo1:
    function closure(){
      var n = 0;
      function test() {
        console.log(++n);
      }
      test() 
      test() 
    }
    closure(); //輸出1,2(這個(gè)很好理解,不多說(shuō))
demo2:
    function test(){
        var i=0;
        return function(){
            console.log(i++);
        }
        }
        var fn = test();
        fn(); //輸出0
        fn(); //輸出1

上述代碼中,fn就是執(zhí)行函數(shù)test()返回的匿名函數(shù)。由于fn又是一個(gè)全局變量,生命周期一直存在,且這個(gè)匿名函數(shù)引用了父函數(shù)test里面的一個(gè)局部變量,所以變量i的狀態(tài)會(huì)被一直保存.

demo3:
    function test(){
        var i=0;
        return function(){
            console.log(i++);
        }
    }
    test()(); //輸出0
    test()(); //輸出0

上述代碼中,執(zhí)行test()返回的是其內(nèi)部的匿名函數(shù),但是執(zhí)行完test()()以后,該匿名函數(shù)的生命周期已經(jīng)結(jié)束,所以變量i的狀態(tài)沒(méi)有得到保存。

最近在簡(jiǎn)書(shū)上讀到一篇有趣的文章,其中一些代碼如下:

for (var i = 0; i < 5; i++) {
 setTimeout((function(i) {
    console.log(i);
  })(i), i * 1000);
}   //輸出0,1,2,3,4

上述代碼中有一個(gè)setTimeout()函數(shù),其使用格式為setTimeout(func,time),意思是至少過(guò)time時(shí)間后,執(zhí)行func。有了這樣的認(rèn)識(shí)后,我們可以把func等價(jià)成:
(function(i){console.log(i)})(i)這個(gè)自執(zhí)行函數(shù)。所以這個(gè)事情分兩步,首先每次循環(huán)自執(zhí)行函數(shù)肯定會(huì)立即執(zhí)行一次,會(huì)依次輸出1,2,3,4。其次,每過(guò)time時(shí)間,執(zhí)行一次func,但是在上述代碼中,func等價(jià)于一個(gè)立即執(zhí)行函數(shù),沒(méi)有返回值,故什么也不會(huì)做。
如果把上述代碼改成這樣:

for (var i = 0; i < 5; i++) {
  var j=7;
  setTimeout((function(i) {
    console.log(i);
    return function(){
       console.info(j++);
    }
  })(i), i * 1000);
}

上述代碼會(huì)依次輸出0,1,2,3,4, 7,8,9,10,11(結(jié)合這個(gè)例子理解上一個(gè)問(wèn)題,就容易多了)

如果把上面的代碼改成這樣呢?

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}

運(yùn)行上面的代碼會(huì)輸出5個(gè)5(這一點(diǎn)現(xiàn)在可以理解了吧),有人不解的是為什么是每隔一秒輸出5而不是隔五秒輸出5。setTimeout(func,time)這個(gè)函數(shù)延遲執(zhí)行的只是func里面的動(dòng)作,而time的值是不存在延遲的。上面執(zhí)行for循環(huán),相當(dāng)于:setTimeout(func,1000),setTimeout(func,2000) .... 第一次setTimeout執(zhí)行的時(shí)候等了一秒(準(zhǔn)確地說(shuō),至少要等一秒),第二次setTimeout執(zhí)行的時(shí)候等2秒,但是前面第一次執(zhí)行的setTimeout函數(shù)時(shí),已經(jīng)等了一秒,所以只需再等一秒就可以立即執(zhí)行了。在這里,需要弄明白的是,setTimeout函數(shù)延遲執(zhí)行的時(shí)間,起點(diǎn)是從time開(kāi)始賦值的時(shí)候計(jì)算的,不是從上一個(gè)setTimeout函數(shù)執(zhí)行完開(kāi)始算的。

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

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

相關(guān)文章

  • Javascript閉包入門(mén)(譯文)

    摘要:也許最好的理解是閉包總是在進(jìn)入某個(gè)函數(shù)的時(shí)候被創(chuàng)建,而局部變量是被加入到這個(gè)閉包中。在函數(shù)內(nèi)部的函數(shù)的內(nèi)部聲明函數(shù)是可以的可以獲得不止一個(gè)層級(jí)的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請(qǐng)自行忽略。 譯者 :文章寫(xiě)在2006年,可直到翻譯的21小時(shí)之前作者還在完善這篇文章,在Stackoverflow的How do Java...

    Fourierr 評(píng)論0 收藏0
  • JavaScript閉包初探

    摘要:說(shuō)了半天,究竟什么是閉包呢閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。彈出上面函數(shù)中的函數(shù)就是閉包,就是通過(guò)建立函數(shù)來(lái)訪問(wèn)函數(shù)內(nèi)部的局部變量。閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。 JavaScript的閉包 首先聲明,這是一篇面向小白的博客,不過(guò)也歡迎各位大牛批評(píng)指正,謝謝。 ??其實(shí)關(guān)于閉包各個(gè)論壇社區(qū)里都有很多的文章來(lái)講它,畢竟閉包是JavaScri...

    沈建明 評(píng)論0 收藏0
  • JavaScript閉包初探

    摘要:說(shuō)了半天,究竟什么是閉包呢閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。彈出上面函數(shù)中的函數(shù)就是閉包,就是通過(guò)建立函數(shù)來(lái)訪問(wèn)函數(shù)內(nèi)部的局部變量。閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。 JavaScript的閉包 首先聲明,這是一篇面向小白的博客,不過(guò)也歡迎各位大牛批評(píng)指正,謝謝。 ??其實(shí)關(guān)于閉包各個(gè)論壇社區(qū)里都有很多的文章來(lái)講它,畢竟閉包是JavaScri...

    canger 評(píng)論0 收藏0
  • JavaScript閉包,只學(xué)這篇就夠了

    摘要:當(dāng)在中調(diào)用匿名函數(shù)時(shí),它們用的都是同一個(gè)閉包,而且在這個(gè)閉包中使用了和的當(dāng)前值的值為因?yàn)檠h(huán)已經(jīng)結(jié)束,的值為。最好將閉包當(dāng)作是一個(gè)函數(shù)的入口創(chuàng)建的,而局部變量是被添加進(jìn)這個(gè)閉包的。 閉包不是魔法 這篇文章使用一些簡(jiǎn)單的代碼例子來(lái)解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...

    CoderBear 評(píng)論0 收藏0
  • 簡(jiǎn)單理解JavaScript閉包

    摘要:閉包在我理解是一種比較抽象的東西。所以我寫(xiě)了一篇博文來(lái)方便自己理解閉包。那么現(xiàn)在我們可以解釋一下閉包的第一個(gè)定義在計(jì)算機(jī)科學(xué)中,閉包是引用了自由變量的函數(shù)。循環(huán)中創(chuàng)建閉包在我們使用的關(guān)鍵字之前,閉包的一個(gè)常見(jiàn)問(wèn)題就出現(xiàn)在循環(huán)中創(chuàng)建閉包。 零. 前言 從我開(kāi)始接觸前端時(shí)就聽(tīng)說(shuō)過(guò)閉包,但是一直不理解閉包究竟是什么。上網(wǎng)看了各種博客,大家對(duì)閉包的說(shuō)法不一。閉包在我理解是一種比較抽象的東西。所...

    sihai 評(píng)論0 收藏0
  • JavaScript閉包

    摘要:閉包引起的內(nèi)存泄漏總結(jié)從理論的角度將由于作用域鏈的特性中所有函數(shù)都是閉包但是從應(yīng)用的角度來(lái)說(shuō)只有當(dāng)函數(shù)以返回值返回或者當(dāng)函數(shù)以參數(shù)形式使用或者當(dāng)函數(shù)中自由變量在函數(shù)外被引用時(shí)才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會(huì)問(wèn)的問(wèn)題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經(jīng)典書(shū)籍等書(shū)中給出的概念,這些概念雖然...

    HmyBmny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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