Javascript 設(shè)計(jì)模式(二) 閉包
閉包的概念:
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
最常見(jiàn)的閉包
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í)行過(guò)程
第一步:定義函數(shù),設(shè)置環(huán)境,創(chuàng)建作用域鏈(scope chain)現(xiàn)a為全局變量,則a的作用域鏈中只有window
第二步:執(zhí)行a, 首先創(chuàng)建作用域(a.scope=a),然后創(chuàng)建活動(dòng)對(duì)象(callObject),并將callObject放入a的作用域鏈的頂端,因此a的作用域鏈中含有兩個(gè)對(duì)象(a和window)
第三步:在活動(dòng)對(duì)象上添加一個(gè)arguments屬性,保存調(diào)用a時(shí)的參數(shù)值
第四步:將形參和內(nèi)部變量賦值到活動(dòng)對(duì)象a上
javascriptGC原理:如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象會(huì)被GC回收。如果兩個(gè)對(duì)象無(wú)干擾的互相引用,那么這兩個(gè)對(duì)象也會(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對(duì)象添加a的作用域中
3、a對(duì)象上添加了arguments屬性,并將i和return函數(shù)賦值給活動(dòng)對(duì)象
4、執(zhí)行a時(shí)將b指向了a的ruturn函數(shù)值,在b中又引用的a中的局部變量i,因此不符合GC的回收標(biāo)準(zhǔn),活動(dòng)對(duì)象a沒(méi)有被回收,因此b訪問(wèn)i是第一次訪問(wèn)的對(duì)象,并且只有在b中才能訪問(wèn)
- javascript設(shè)計(jì)模式 接口介紹
- javascript設(shè)計(jì)模式 封裝和信息隱藏(上)
- javascript學(xué)習(xí)筆記(九) js對(duì)象 設(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實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-06-06JS實(shí)現(xiàn)iframe自適應(yīng)高度的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)iframe自適應(yīng)高度的方法,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)iframe高度自適應(yīng)的實(shí)現(xiàn)技巧,并給出了項(xiàng)目示例供大家參考,需要的朋友可以參考下2017-01-01微信小程序頁(yè)面間跳轉(zhuǎn)傳參方式總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于微信小程序頁(yè)面間跳轉(zhuǎn)傳參方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06小程序按鈕避免多次調(diào)用接口和點(diǎn)擊方案實(shí)現(xiàn)(不用showLoading)
這篇文章主要介紹了小程序按鈕避免多次調(diào)用接口和點(diǎn)擊方案實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04JavaScript實(shí)現(xiàn)拖拽簡(jiǎn)單效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)拖拽簡(jiǎn)單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09JS數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列結(jié)構(gòu)詳解
隊(duì)列指的是一種受限的線性表,先進(jìn)先出,今天通過(guò)本文帶領(lǐng)大家認(rèn)識(shí)隊(duì)列及隊(duì)列的應(yīng)用,對(duì)JS數(shù)據(jù)結(jié)構(gòu)與算法-隊(duì)列結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-11-11javascript 判斷用戶有沒(méi)有操作頁(yè)面
這篇文章主要介紹了javascript 判斷用戶有沒(méi)有操作頁(yè)面的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10解決layer.confirm選擇完之后消息框不消失的問(wèn)題
今天小編就為大家分享一篇解決layer.confirm選擇完之后消息框不消失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09