淺析javascript閉包 實(shí)例分析
更新時(shí)間:2010年12月25日 22:35:43 作者:
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是環(huán)境表達(dá)式的一部分。
官方解釋
“閉包”是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是環(huán)境表達(dá)式的一部分。
通俗解釋
Javascript中所有的函數(shù)都是一個(gè)閉包。不過一般來說,嵌套的function產(chǎn)生的閉包更為強(qiáng)大,也是大部分時(shí)候我們所說的“閉包”??慈缦麓a:
<script type="text/javascript">
<!--
//外層函數(shù)a
function a(){
//臨時(shí)變量i
var i = 0;
//內(nèi)層函數(shù)b
function b(){
//引用外層臨時(shí)變量i
alert(++i);
}
//執(zhí)行結(jié)果,返回內(nèi)層函數(shù)b
return b;
}
//執(zhí)行外層函數(shù)a,同時(shí)給c一個(gè)指向內(nèi)層函數(shù)b的引用
//若按正常理解,此語句執(zhí)行完后i將被GC回收,此時(shí)的i應(yīng)為“undefine”
var c = a();
//執(zhí)行內(nèi)層函數(shù),由于閉包的緣故,函數(shù)b中i仍然引用的是外部的臨時(shí)變量i
c();
-->
</script>
這段腳本在執(zhí)行完var c=a()之后,變量c實(shí)際上就指向了函數(shù)b,b中用到了變量i,再執(zhí)行c()后就會(huì)彈出一個(gè)窗口顯示i的值。這段代碼其實(shí)就是一個(gè)閉包,為什么?因?yàn)楹瘮?shù)a外的變量c引用了函數(shù)a內(nèi)部的函數(shù)b。
Javascript的垃圾回收機(jī)制
由于javascript特殊的垃圾回收機(jī)制,才導(dǎo)致了閉包的產(chǎn)生。Javascript垃圾回收機(jī)制的大體規(guī)則如下:
在javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收。如果兩個(gè)對(duì)象相互引用,而不再被第3者引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。而在上述的腳本中,函數(shù)a被b引用,函數(shù)b又被函數(shù)a外的c所引用,這就是為什么函數(shù)a執(zhí)行后不被回收的原因。
閉包的應(yīng)用場(chǎng)景
1. 保護(hù)函數(shù)內(nèi)的變量安全。以上面的例子為例,函數(shù)a中變量i只有函數(shù)b才能訪問,而無法通過其他途徑訪問到,因此保護(hù)了i的安全性。
2. 在內(nèi)存中維持一個(gè)變量。依然如上面的例子,由于閉包,函數(shù)a中的i一直存在于內(nèi)存中,因此每次執(zhí)行c(),i都會(huì)加1。
3. 通過保護(hù)變量的安全實(shí)現(xiàn)JS私有屬性和私有方法(不能被外部訪問)。如下,私有屬性和私有方法在Constructor外是無法訪問的:
function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}
“閉包”是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是環(huán)境表達(dá)式的一部分。
通俗解釋
Javascript中所有的函數(shù)都是一個(gè)閉包。不過一般來說,嵌套的function產(chǎn)生的閉包更為強(qiáng)大,也是大部分時(shí)候我們所說的“閉包”??慈缦麓a:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
<!--
//外層函數(shù)a
function a(){
//臨時(shí)變量i
var i = 0;
//內(nèi)層函數(shù)b
function b(){
//引用外層臨時(shí)變量i
alert(++i);
}
//執(zhí)行結(jié)果,返回內(nèi)層函數(shù)b
return b;
}
//執(zhí)行外層函數(shù)a,同時(shí)給c一個(gè)指向內(nèi)層函數(shù)b的引用
//若按正常理解,此語句執(zhí)行完后i將被GC回收,此時(shí)的i應(yīng)為“undefine”
var c = a();
//執(zhí)行內(nèi)層函數(shù),由于閉包的緣故,函數(shù)b中i仍然引用的是外部的臨時(shí)變量i
c();
-->
</script>
這段腳本在執(zhí)行完var c=a()之后,變量c實(shí)際上就指向了函數(shù)b,b中用到了變量i,再執(zhí)行c()后就會(huì)彈出一個(gè)窗口顯示i的值。這段代碼其實(shí)就是一個(gè)閉包,為什么?因?yàn)楹瘮?shù)a外的變量c引用了函數(shù)a內(nèi)部的函數(shù)b。
Javascript的垃圾回收機(jī)制
由于javascript特殊的垃圾回收機(jī)制,才導(dǎo)致了閉包的產(chǎn)生。Javascript垃圾回收機(jī)制的大體規(guī)則如下:
在javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收。如果兩個(gè)對(duì)象相互引用,而不再被第3者引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。而在上述的腳本中,函數(shù)a被b引用,函數(shù)b又被函數(shù)a外的c所引用,這就是為什么函數(shù)a執(zhí)行后不被回收的原因。
閉包的應(yīng)用場(chǎng)景
1. 保護(hù)函數(shù)內(nèi)的變量安全。以上面的例子為例,函數(shù)a中變量i只有函數(shù)b才能訪問,而無法通過其他途徑訪問到,因此保護(hù)了i的安全性。
2. 在內(nèi)存中維持一個(gè)變量。依然如上面的例子,由于閉包,函數(shù)a中的i一直存在于內(nèi)存中,因此每次執(zhí)行c(),i都會(huì)加1。
3. 通過保護(hù)變量的安全實(shí)現(xiàn)JS私有屬性和私有方法(不能被外部訪問)。如下,私有屬性和私有方法在Constructor外是無法訪問的:
復(fù)制代碼 代碼如下:
function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}
您可能感興趣的文章:
- javascript深入理解js閉包
- 深入理解Javascript閉包 新手版
- Javascript閉包演示代碼小結(jié)
- JavaScript 匿名函數(shù)(anonymous function)與閉包(closure)
- JavaScript閉包 懂不懂由你反正我是懂了
- JavaScript中的作用域鏈和閉包
- 深入Javascript函數(shù)、遞歸與閉包(執(zhí)行環(huán)境、變量對(duì)象與作用域鏈)使用詳解
- javascript閉包的高級(jí)使用方法實(shí)例
- JavaScript閉包函數(shù)訪問外部變量的方法
- 詳談JavaScript 匿名函數(shù)及閉包
- JavaScript閉包詳解
相關(guān)文章
js當(dāng)一個(gè)變量為函數(shù)時(shí) 應(yīng)該注意的一點(diǎn)細(xì)節(jié)小結(jié)
變量testFun為一個(gè)匿名函數(shù),匿名函數(shù)返回的一個(gè)testFun.init對(duì)象(也是一個(gè)匿名函數(shù))2011-12-12
原生javascript實(shí)現(xiàn)勻速運(yùn)動(dòng)動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了原生javascript實(shí)現(xiàn)勻速運(yùn)動(dòng)動(dòng)畫效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
利用CSS、JavaScript及Ajax實(shí)現(xiàn)高效的圖片預(yù)加載
圖片預(yù)加載想必大家都不陌生吧,實(shí)現(xiàn)預(yù)加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術(shù)可根據(jù)不同設(shè)計(jì)場(chǎng)景設(shè)計(jì)出相應(yīng)的解決方案,十分高效2013-10-10
javascript過濾數(shù)組重復(fù)元素的實(shí)現(xiàn)方法
這篇文章主要介紹了javascript過濾數(shù)組重復(fù)元素的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
javascript獲取url上某個(gè)參數(shù)的方法
獲取url上的某個(gè)參數(shù)的方法有很多,在本文為大家介紹下使用javascript是如何實(shí)現(xiàn)的,感興趣的朋友不要錯(cuò)過2013-11-11
JS實(shí)現(xiàn)深度優(yōu)先搜索求解兩點(diǎn)間最短路徑
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)深度優(yōu)先搜索求解兩點(diǎn)間最短路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
JS面向?qū)ο髮?shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了JS面向?qū)ο髮?shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08

