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