小編給大家分享一下JavaScript閉包的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、特克斯網(wǎng)站維護(hù)、網(wǎng)站推廣。閉包是JavaScript中的一個(gè)難點(diǎn),同時(shí)也是它的特色,JavaScript的很多高級(jí)應(yīng)用都要依靠閉包來(lái)實(shí)現(xiàn)。以下是我學(xué)習(xí)閉包的記錄,希望對(duì)你有些幫助。
變量作用域
在學(xué)習(xí)閉包之前,我們首先要理解JavaScript不同與其他語(yǔ)言獨(dú)特的變量作用域。在JavaScript中,不存在局部作用域的概念,但是有全局作用域以及函數(shù)作用域。全局作用域與其他語(yǔ)言的相同,沒(méi)有需要注意的地方,而函數(shù)作用域是指函數(shù)內(nèi)部聲明的變量在函數(shù)外部無(wú)法直接訪問(wèn)。
var a = 99; function f1() { console.log(a); } f1();
上面的代碼中,f1可以讀取到全局變量a,而下面的代碼中a無(wú)法被訪問(wèn)。
function f1() { var a = 99; } console.log(a);
如何從外部讀取函數(shù)內(nèi)部聲明的變量?
在某些情況下,我們可能需要得到函數(shù)內(nèi)部的變量,正常情況下是無(wú)法做到的,因此需要用特殊的辦法。
function f1() { var a = 99; function f2() { console.log(a); } }
上面代碼中,我們?cè)诤瘮?shù)f1中定義另一個(gè)函數(shù)f2,這樣f1中的所有變量對(duì)于f2來(lái)說(shuō)就是可見(jiàn)的,既然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è)簡(jiǎn)單的閉包。因此,閉包就可以簡(jiǎn)單的理解為函數(shù)中的函數(shù),而本質(zhì)上,閉包就是一個(gè)連接函數(shù)內(nèi)部和外部的橋梁。
閉包的特性
閉包會(huì)使得函數(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的值就在原來(lái)的基礎(chǔ)上累加1,因此,函數(shù)A中的count變量會(huì)一直保存在內(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ù)就會(huì)記住這個(gè)值,所以在后面?zhèn)魅?的時(shí)候只會(huì)對(duì)B函數(shù)中的y賦值,所以最后會(huì)輸出8。
使用閉包的注意點(diǎn)
由于上述閉包的特性,每次使用閉包都會(huì)大量增加內(nèi)存的消耗,所以不能濫用閉包,否則會(huì)影響網(wǎng)頁(yè)的性能。我們也可以在函數(shù)退出前,使函數(shù)內(nèi)變量指向null來(lái)手動(dòng)刪除變量。我們可以來(lái)看下一道經(jīng)典的面試題來(lái)理解。
function outer(){ var num = 0; //內(nèi)部變量 return function add() { //通過(guò)return返回add函數(shù),就可以在outer函數(shù)外訪問(wèn)了 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)部的私有作用域會(huì)一直被占用 var func2 = outer(); func2(); // 輸出1 每次重新引用函數(shù)的時(shí)候,閉包是全新的。 func2(); // 輸出2
以上是“JavaScript閉包的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:JavaScript閉包的示例分析-創(chuàng)新互聯(lián)
鏈接地址:http://www.rwnh.cn/article42/ddsjec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、面包屑導(dǎo)航、建站公司、虛擬主機(jī)、服務(wù)器托管、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容