Javascript 設(shè)計(jì)模式(二) 閉包
更新時(shí)間:2010年05月26日 22:14:34 作者:
本來應(yīng)該是第二章,接口,但因?yàn)殚]包實(shí)在不懂,所以先看看閉包
正文
閉包的概念:
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
最常見的閉包
function a() {
var i=0;
return function(){
alert(i++);
}
}
var b=a();
for(var i=0;i<3;i++){
b();
}
解釋上面代碼前,先接受一個(gè)函數(shù)的創(chuàng)建和執(zhí)行過程
第一步:定義函數(shù),設(shè)置環(huán)境,創(chuàng)建作用域鏈(scope chain)現(xiàn)a為全局變量,則a的作用域鏈中只有window
第二步:執(zhí)行a, 首先創(chuàng)建作用域(a.scope=a),然后創(chuàng)建活動(dòng)對象(callObject),并將callObject放入a的作用域鏈的頂端,因此a的作用域鏈中含有兩個(gè)對象(a和window)
第三步:在活動(dòng)對象上添加一個(gè)arguments屬性,保存調(diào)用a時(shí)的參數(shù)值
第四步:將形參和內(nèi)部變量賦值到活動(dòng)對象a上
javascriptGC原理:如果一個(gè)對象不再被引用,那么這個(gè)對象會(huì)被GC回收。如果兩個(gè)對象無干擾的互相引用,那么這兩個(gè)對象也會(huì)被回收。
總結(jié):
1、首先定義a時(shí),創(chuàng)建了a的作用域鏈(scope chain)
2、(var b=a())執(zhí)行a時(shí),創(chuàng)建作用域a.scope=a,并創(chuàng)建callObject對象添加a的作用域中
3、a對象上添加了arguments屬性,并將i和return函數(shù)賦值給活動(dòng)對象
4、執(zhí)行a時(shí)將b指向了a的ruturn函數(shù)值,在b中又引用的a中的局部變量i,因此不符合GC的回收標(biāo)準(zhǔn),活動(dòng)對象a沒有被回收,因此b訪問i是第一次訪問的對象,并且只有在b中才能訪問
閉包的概念:
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
最常見的閉包
復(fù)制代碼 代碼如下:
function a() {
var i=0;
return function(){
alert(i++);
}
}
var b=a();
for(var i=0;i<3;i++){
b();
}
解釋上面代碼前,先接受一個(gè)函數(shù)的創(chuàng)建和執(zhí)行過程
第一步:定義函數(shù),設(shè)置環(huán)境,創(chuàng)建作用域鏈(scope chain)現(xiàn)a為全局變量,則a的作用域鏈中只有window
第二步:執(zhí)行a, 首先創(chuàng)建作用域(a.scope=a),然后創(chuàng)建活動(dòng)對象(callObject),并將callObject放入a的作用域鏈的頂端,因此a的作用域鏈中含有兩個(gè)對象(a和window)
第三步:在活動(dòng)對象上添加一個(gè)arguments屬性,保存調(diào)用a時(shí)的參數(shù)值
第四步:將形參和內(nèi)部變量賦值到活動(dòng)對象a上
javascriptGC原理:如果一個(gè)對象不再被引用,那么這個(gè)對象會(huì)被GC回收。如果兩個(gè)對象無干擾的互相引用,那么這兩個(gè)對象也會(huì)被回收。
總結(jié):
1、首先定義a時(shí),創(chuàng)建了a的作用域鏈(scope chain)
2、(var b=a())執(zhí)行a時(shí),創(chuàng)建作用域a.scope=a,并創(chuàng)建callObject對象添加a的作用域中
3、a對象上添加了arguments屬性,并將i和return函數(shù)賦值給活動(dòng)對象
4、執(zhí)行a時(shí)將b指向了a的ruturn函數(shù)值,在b中又引用的a中的局部變量i,因此不符合GC的回收標(biāo)準(zhǔn),活動(dòng)對象a沒有被回收,因此b訪問i是第一次訪問的對象,并且只有在b中才能訪問
您可能感興趣的文章:
- javascript設(shè)計(jì)模式 接口介紹
- javascript設(shè)計(jì)模式 封裝和信息隱藏(上)
- javascript學(xué)習(xí)筆記(九) js對象 設(shè)計(jì)模式
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- JavaScript 設(shè)計(jì)模式 富有表現(xiàn)力的Javascript(一)
- javascript 設(shè)計(jì)模式之單體模式 面向?qū)ο髮W(xué)習(xí)基礎(chǔ)
- JavaScript 設(shè)計(jì)模式之組合模式解析
- 小議javascript 設(shè)計(jì)模式 推薦
- JavaScript 設(shè)計(jì)模式學(xué)習(xí) Factory
- JavaScript 設(shè)計(jì)模式學(xué)習(xí) Singleton
- 一種JavaScript的設(shè)計(jì)模式
- javascript設(shè)計(jì)模式之工廠模式示例講解
相關(guān)文章
javascript 四則運(yùn)算精度修正函數(shù)代碼
JS預(yù)算精度問題確實(shí)很麻煩,這個(gè)能解決一些問題,雖然有bug.2010-05-05
原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積
這篇文章主要介紹了使用原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積的方法及示例代碼分享,效果十分漂亮,需要的朋友可以參考下2015-01-01
js利用數(shù)組length屬性清空和截短數(shù)組的小例子
這篇文章主要介紹了js利用數(shù)組length屬性清空和截短數(shù)組的小例子,有需要的朋友可以參考一下2014-01-01
純JS實(shí)現(xiàn)監(jiān)控本地文件變化
你是否曾夢想擁有一個(gè)能夠?qū)崟r(shí)監(jiān)控本地文件變化的網(wǎng)頁應(yīng)用,現(xiàn)在,這個(gè)夢想即將成為現(xiàn)實(shí),本文將通過純JS實(shí)現(xiàn)這一功能,感興趣的小伙伴可以了解下2025-04-04
js 實(shí)現(xiàn)獲取name 相同的頁面元素并循環(huán)遍歷的方法
下面小編就為大家?guī)硪黄猨s 實(shí)現(xiàn)獲取name 相同的頁面元素并循環(huán)遍歷的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02

