網上有不少關於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 這樣的一個關係。作用域
未完待續。。。