資源描述:
《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è)匿