新聞中心
這篇文章主要介紹“JavaScript閉包使用實(shí)例分析”,在日常操作中,相信很多人在JavaScript閉包使用實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript閉包使用實(shí)例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、京山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為京山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
變量作用域
在學(xué)習(xí)閉包之前,我們首先要理解JavaScript不同與其他語言獨(dú)特的變量作用域。在JavaScript中,不存在局部作用域的概念,但是有全局作用域以及函數(shù)作用域。全局作用域與其他語言的相同,沒有需要注意的地方,而函數(shù)作用域是指函數(shù)內(nèi)部聲明的變量在函數(shù)外部無法直接訪問。
var a = 99; function f1() { console.log(a); } f1();
上面的代碼中,f1可以讀取到全局變量a,而下面的代碼中a無法被訪問。
function f1() { var a = 99; } console.log(a);
如何從外部讀取函數(shù)內(nèi)部聲明的變量?
在某些情況下,我們可能需要得到函數(shù)內(nèi)部的變量,正常情況下是無法做到的,因此需要用特殊的辦法。
function f1() { var a = 99; function f2() { console.log(a); } }
上面代碼中,我們在函數(shù)f1中定義另一個(gè)函數(shù)f2,這樣f1中的所有變量對于f2來說就是可見的,既然f2可以讀取到f1中的變量,那么我們只要把f2作為f1的返回值,我們就可以在f1的外部讀取到它內(nèi)部的變量了。
function f1() { var a = 99; function f2() { console.log(a); } return f2; } var result = f1(); result();
此時(shí),就形成了一個(gè)簡單的閉包。因此,閉包就可以簡單的理解為函數(shù)中的函數(shù),而本質(zhì)上,閉包就是一個(gè)連接函數(shù)內(nèi)部和外部的橋梁。
閉包的特性
閉包會使得函數(shù)中的變量都被保存到內(nèi)存中。首先我們先看一下以下兩個(gè)例子
function A() { var count = 0; function B() { count++; console.log(count); } return B; } var C = A(); C(); // 1 C(); // 2 C(); // 3
count是函數(shù)A中的一個(gè)變量,它的值在函數(shù)B中被改變,函數(shù)B每執(zhí)行一次,count的值就在原來的基礎(chǔ)上累加1,因此,函數(shù)A中的count變量會一直保存在內(nèi)存中。
function A(x) { function B(y) { console.log(x+y); } return B; } var C = A(3); C(5); //8
當(dāng)3傳入A函數(shù)后,B函數(shù)就會記住這個(gè)值,所以在后面?zhèn)魅?的時(shí)候只會對B函數(shù)中的y賦值,所以最后會輸出8。
使用閉包的注意點(diǎn)
由于上述閉包的特性,每次使用閉包都會大量增加內(nèi)存的消耗,所以不能濫用閉包,否則會影響網(wǎng)頁的性能。我們也可以在函數(shù)退出前,使函數(shù)內(nèi)變量指向null來手動刪除變量。我們可以來看下一道經(jīng)典的面試題來理解。
function outer(){ var num = 0; //內(nèi)部變量 return function add() { //通過return返回add函數(shù),就可以在outer函數(shù)外訪問了 num++; //內(nèi)部函數(shù)有引用,作為add函數(shù)的一部分了 console.log(num); }; } var func1 = outer(); func1(); //實(shí)際上是調(diào)用add函數(shù), 輸出1 func1(); //輸出2 因?yàn)閛uter函數(shù)內(nèi)部的私有作用域會一直被占用 var func2 = outer(); func2(); // 輸出1 每次重新引用函數(shù)的時(shí)候,閉包是全新的。 func2(); // 輸出2
到此,關(guān)于“JavaScript閉包使用實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
當(dāng)前標(biāo)題:JavaScript閉包使用實(shí)例分析
分享地址:http://fisionsoft.com.cn/article/gospes.html