2018-4-25 seo達(dá)人
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
首先先介紹一下作用域等一些基礎(chǔ)概念。
每個(gè)JavaScript函數(shù)都是一個(gè)對(duì)象,對(duì)象中有些屬性我們可以訪問(wèn),但有些不可以,這些屬性僅供JavaScript引擎存取,[[scope]]就是其中一個(gè)。
[[scope]] : 指的就是我們所說(shuō)的作用域,其中存儲(chǔ)了執(zhí)行期上下文的集合
作用域鏈 : [[scope]] 中所存儲(chǔ)的執(zhí)行期上下文對(duì)象的集合,這個(gè)集合呈鏈?zhǔn)芥溄樱覀儼堰@種鏈接叫做作用域鏈。
運(yùn)行期上下文 : 當(dāng)函數(shù)執(zhí)行時(shí),會(huì)創(chuàng)建一個(gè)稱為執(zhí)行期上下文的內(nèi)部對(duì)象(AO)。一個(gè)執(zhí)行期上下文定義了一個(gè)函數(shù)執(zhí)行的環(huán)境,函數(shù)每次執(zhí)行時(shí)對(duì)應(yīng)的執(zhí)行環(huán)境都是的,所以多次調(diào)用一個(gè)函數(shù)會(huì)導(dǎo)致創(chuàng)建多個(gè)執(zhí)行上下文,當(dāng)函數(shù)執(zhí)行完畢,它所產(chǎn)生的執(zhí)行上下文被銷(xiāo)毀。
查找變量 :從作用域鏈的頂端依次向下查找。
下面舉一些例子:
之前學(xué)過(guò)函數(shù)的定義、函數(shù)表達(dá)式,還有一種函數(shù)叫做立即執(zhí)行函數(shù)。
立即執(zhí)行函數(shù):函數(shù)執(zhí)行過(guò)后立即被銷(xiāo)毀。
立即執(zhí)行函數(shù)的官方寫(xiě)法:
針對(duì)初始化功能的函數(shù),可以有參數(shù)。
只有表達(dá)式才能被執(zhí)行符號(hào)執(zhí)行,能被執(zhí)行符號(hào)執(zhí)行的表達(dá)式,函數(shù)名字會(huì)被自動(dòng)忽略。
下面是一道曾阿里面試題
下面是幾道經(jīng)典的例題,可以參考一下:
那么采用立即執(zhí)行函數(shù)呢?會(huì)有怎樣的結(jié)果呢?
閉包的現(xiàn)象:當(dāng)內(nèi)部函數(shù)保存到外部時(shí)會(huì)產(chǎn)生閉包。
閉包會(huì)導(dǎo)致原有的作用域鏈不釋放,造成內(nèi)存泄漏
(內(nèi)存泄漏:內(nèi)存占用(比如:手握沙子,握得越緊手里剩得就越少))
閉包觸發(fā)的情況:
兩個(gè)或多個(gè)函數(shù)互相嵌套,把里面的函數(shù)保存到外部,這樣的情況一定會(huì)產(chǎn)生閉包。從外面還可以調(diào)用里面的函數(shù)。
閉包的作用:
實(shí)現(xiàn)公有變量
eg:函數(shù)累加器
可以做緩存(存儲(chǔ)結(jié)構(gòu))
eg:eater
可以實(shí)現(xiàn)封裝,屬性私有化
eg:person()
模塊化開(kāi)發(fā),防止污染全局變量
附加一個(gè)逗號(hào)操作符:
先看前面的表達(dá)式,再看后面的表達(dá)式,把后面表達(dá)式的計(jì)算結(jié)構(gòu)返回
例題:
作用域
立即執(zhí)行函數(shù)
大家可以自行思考一下。
閉包
藍(lán)藍(lán)設(shè)計(jì)的小編 http://sillybuy.com