關於匿名函數,閉包和做用域鏈

網上有不少關於javascript做用域鏈和閉包的解釋說明,但大多數都是風格統一的例子解釋,看的多了也就煩了,因此以這篇筆記來梳理本身的理解,若是有以爲不對的,但願能夠指出,共勉。javascript

 

首先說下做用域的問題:java

  以線段來比喻做用域的初始狀態,原始的做用域鏈就是一個實心點,表明window這個全局環境,這個就是最原始的執行環境閉包

  若是在window環境下執行,var a = ‘this is window’ 或者 a = 'this is window',那麼a這個變量就隸屬於window函數

  由於js中不存在塊級語法,因此像條件,循環語句是不能新建一個執行環境的,也就是說下面的定義最後都屬於windowthis

  

 1 if(b) {
 2     var c;  
 3 }
 4 
 5 while(d) {
 6     var e;  
 7 }
 8 
 9 for(var f=0; ; ) {
10     var g;
11 }

  以上代碼不會爲由於b和c在if中,因此他們的執行環境變成了,if或者while或者for,他們始終仍是屬於windowspa

 

  那什麼狀況下,會改變代碼的執行環境? 那就是函數,也只有函數能新建執行環境,包括通常函數,匿名函數等等,只要是函數,就會自動在當前執行環境下新建一個執行環境。code

 

  

function b(){
    // code  
}

function c(){
    // code  
}

function d(){
    //  e in d
    function e(){
        // code
    }  
}    

  以上共新建了4個新的執行環境,能夠當作四個點,首先按照順序 點window—— 點b —— 點c —— 點d ,很明確,b,c,d屬於window執行環境下,並且都在window以前,中間的——就帶表本身的環境域blog

  點window是看不到點b以前的——(環境域),包括點c和點d的,因此既然看不到也就沒法使用,可是,點d卻能看到點window的,這就造成了做用域鏈。ip

  最後 點e在點d中,因此就是 點d —— 點e 這樣的一個關係。作用域

 

  未完待續。。。

相關文章
相關標籤/搜索