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