javascript中閉包的寫(xiě)法和作用詳解_javascript技巧

javascript中閉包的寫(xiě)法和作用詳解_javascript技巧

ID:30777280

大小:54.00 KB

頁(yè)數(shù):6頁(yè)

時(shí)間:2019-01-03

javascript中閉包的寫(xiě)法和作用詳解_javascript技巧_第1頁(yè)
javascript中閉包的寫(xiě)法和作用詳解_javascript技巧_第2頁(yè)
javascript中閉包的寫(xiě)法和作用詳解_javascript技巧_第3頁(yè)
javascript中閉包的寫(xiě)法和作用詳解_javascript技巧_第4頁(yè)
javascript中閉包的寫(xiě)法和作用詳解_javascript技巧_第5頁(yè)
資源描述:

《javascript中閉包的寫(xiě)法和作用詳解_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)

1、JavaScript中閉包的寫(xiě)法和作用詳解1、什么是閉包閉包是有權(quán)訪(fǎng)問(wèn)另一個(gè)函數(shù)作用域的變量的函數(shù)。簡(jiǎn)單的說(shuō),Javascript允許使用內(nèi)部函數(shù)一-即函數(shù)定義和函數(shù)表達(dá)式位于另一個(gè)函數(shù)的函數(shù)體內(nèi)。而且,這些內(nèi)部函數(shù)可以訪(fǎng)問(wèn)它們所在的外部函數(shù)中聲明的所冇局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)。當(dāng)英屮一個(gè)這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時(shí),就會(huì)形成閉包。2、變量的作用域要理解閉包,首先要理解變量的作用域。變量的作用域無(wú)非就是兩種:全局變量和局部變量。Javascript語(yǔ)言的特殊Z處,就在于函數(shù)內(nèi)部可以直接讀取全局變量。其中

2、內(nèi)部函數(shù)中可以訪(fǎng)問(wèn)外部函數(shù)的變量,是因?yàn)閮?nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域;也叮以理解為:內(nèi)部函數(shù)的作用范圍輻射到了外部函數(shù)的作用范圍;varn=999;functionfl(){alert(n);}fl0;//999另一方而,在函數(shù)外部自然無(wú)法讀取函數(shù)內(nèi)的局部變量。functionfl(){varn=999;}alert(n);//error這里有一個(gè)地方需要注意,函數(shù)內(nèi)部聲明變量的時(shí)候,一定要使用v肛命令。如果不用的話(huà),你實(shí)際上聲明了一個(gè)全局變量!functionfl(){n=999;fl0;alert(n);//99

3、93、閉包的幾種寫(xiě)法和用法3.1、給函數(shù)添加一些屬性functionCircle(r){this,r=r;}Circle.PI二3.14159;Circle,prototype,area二function(){rcturnCirclc.PI*this.r*this.r;}varc=newCircle(1.0);alert(c.area());//3.141593.2、是聲明一個(gè)變量,將一個(gè)函數(shù)當(dāng)作值賦給變量varCircle=function(){varobj=newObject();obj.PI=3.14159;obj.eirc

4、Ei=function(r){returnthis?Pl*r*r;}returnobj;}varc=newCircleO;alert(c.area(1.0));//3.141593.3、這種方法使用較多,也最為方便。varobj二{}就是聲明一個(gè)空的對(duì)象varCircle={〃PI〃:3?14159,,zarea,z:function(r){returnthis.PI*r*r;}};alert(Circle.arca(l.0));//3.141594、閉包的主要作用閉包可以用在許多地方。它的最大用處冇兩個(gè):一個(gè)是前而捉到的可以讀取

5、函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。4.1、如何從外部讀取局部變量?出于種種原因,我們有時(shí)候需要得到函數(shù)內(nèi)的局部變量。但是,前面已經(jīng)說(shuō)過(guò)了,正常情況下,這是辦不到的,只有通過(guò)變通方法才能實(shí)現(xiàn)。那就是在函數(shù)的內(nèi)部,再定義一個(gè)函數(shù)。functionfl(){varn=999;functionf2(){alert(n);//999}}在上面的代碼中,函數(shù)f2就被包括在函數(shù)fl內(nèi)部,這時(shí)fl內(nèi)部的所有局部變量,對(duì)f2都是可見(jiàn)的。但是反過(guò)來(lái)就不行,f2內(nèi)部的局部變量,對(duì)fl就是不可見(jiàn)的。這就是Javascript語(yǔ)言特

6、有的"鏈?zhǔn)阶饔糜?結(jié)構(gòu)(chainscope),了對(duì)彖會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)彖的變量。所以,父對(duì)象的所冇變量,對(duì)子對(duì)彖都是可見(jiàn)的,反之則不成立。既然f2可以讀取fl中的局部變量,那么只要把f2作為返冋值,我們不就可以在fl外部讀取它的內(nèi)部變量了嗎!functionfl(){varn二999;functionf2(){alert(n);}returnf2;}varresult=f1();result();//9994.2、如何將變量的值始終保存在內(nèi)存當(dāng)中?functionfl(){varn二999;□Add二function(

7、){n+二1}functionf2(){alert(n);}returnf2;}varresult=f1();result();//999nAdd();result();//1000在這段代碼中,result實(shí)際上就是閉包f2函數(shù)。它一共運(yùn)行了兩次,第一次的值是999,第二次的值是1000o這證明了,函數(shù)fl中的局部變量n—直保存在內(nèi)存小,并沒(méi)有在fl調(diào)用后被自動(dòng)清除。為什么會(huì)這樣呢?原因就在于fl是f2的父函數(shù),而f2被賦給了一個(gè)全局變量,這導(dǎo)致f2始終在內(nèi)存中,而f2的存在依賴(lài)于fl,因此fl也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后,

8、被垃圾冋收機(jī)制(garbagecollection)冋收。這段代碼中另一個(gè)值得注意的地方,就是二function(){n+二1}〃這一行,首先在nAddm面沒(méi)有使用var關(guān)鍵字,因此nAdd是一個(gè)全局變量,而不是局部變量。其次,nAdd的值是一個(gè)匿

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。