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

資訊專欄INFORMATION COLUMN

JavaScript閉包

focusj / 406人閱讀

摘要:閉包的含義和作用根據(jù)作用鏈,只能在內(nèi)部訪問到外部函數(shù),通過閉包外部也可以訪問內(nèi)部變量。有垃圾清理機(jī)制,當(dāng)一個(gè)對(duì)象使用后會(huì)自動(dòng)清理,閉包可以使變量一直保存在內(nèi)存中不會(huì)被清理。

閉包的含義和作用

1、根據(jù)JavaScript作用鏈,只能在內(nèi)部訪問到外部函數(shù),通過閉包外部也可以訪問內(nèi)部變量。
2、js有垃圾清理機(jī)制,當(dāng)一個(gè)對(duì)象使用后會(huì)自動(dòng)清理,閉包可以使變量一直保存在內(nèi)存中不會(huì)被清理。

正常情況下的訪問 inner內(nèi)部函數(shù)可以訪問到變量a,但是outer訪問不到inner的變量b
`
function outer (){

let a = 1;
function inner(){
    let b = 2;
    console.log(a); //1
}

}
`
使用閉包可以當(dāng)函數(shù)執(zhí)行完后變量仍然保持,將c保存到返回的inner1函數(shù)里,當(dāng)outer1執(zhí)行完后,c并不會(huì)被銷毀而是返回到inner函數(shù)中。
調(diào)用outer1()后,返回了inner1賦值給closure。再執(zhí)行closure可以即從外部獲得變量c

function outer1(){
    let c = 99;
    //將變量返回到內(nèi)部函數(shù)中
    return function inner1(){
        return c;
    }
}
let closure =  outer1();
let c1 = closure() // 99
用閉包來解決在循環(huán)中遇到的相關(guān)問題

當(dāng)給多個(gè)元素綁定點(diǎn)擊事件時(shí)使用循環(huán)遍歷綁定的方法,點(diǎn)擊綁定事件是異步回調(diào)的方法,所以會(huì)等到循環(huán)結(jié)束后才將i返回,以下會(huì)導(dǎo)致的問題就是無論點(diǎn)擊哪個(gè)元素都只會(huì)打印3


div0
div1
div2

使用閉包,封裝成一個(gè)獨(dú)立的立即執(zhí)行的匿名函數(shù),將每次循環(huán)的i作為參數(shù)傳進(jìn)去,這樣就可以在執(zhí)行的時(shí)候取到當(dāng)前i的值而不是循環(huán)結(jié)束后的值,分別點(diǎn)擊div都是打印的是0,1,2

for(var i=0;i<3;i++){
    (function(n){
        var div = document.getElementById("div"+n).addEventListener("click",function(){
            console.log(n)
        })
    })(i)
}

同理setTimeout也是異步回調(diào),如果沒有使用閉包將它包裹會(huì)打印三次3

function(){
    for(var i=0;i<3;i++){
        setTimeout(()=>{
            console.log(i)
        },0)
    }
}

使用閉包后分別打印出0,1,2,3,4,5

for(let n=0;n<6;n++){
    (function(m){
        setTimeout(()=>{
            console.log(m)
        },0)
    })(n)
}
注意事項(xiàng)

使用閉包會(huì)導(dǎo)致內(nèi)存外泄,因?yàn)楫?dāng)函數(shù)執(zhí)行完后里面的變量并沒有被垃圾清除機(jī)制清理,過多使用閉包會(huì)影響性能。

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

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

相關(guān)文章

  • Javascript閉包入門(譯文)

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

    Fourierr 評(píng)論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。可惜的是,并沒有提供相關(guān)的成員和方法來訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個(gè)非常重要的語言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個(gè)新的語言特性。本文將...

    dayday_up 評(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)單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...

    CoderBear 評(píng)論0 收藏0
  • JavaScript深入之閉包

    摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...

    caige 評(píng)論0 收藏0
  • 還擔(dān)心面試官問閉包?

    摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記] JavaScript 閉包

    摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來說,一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀。所以此時(shí),的作用域鏈雖然銷毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...

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

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

0條評(píng)論

閱讀需要支付1元查看
<