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