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