网上有不少关于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 这样的一个关系。作用域
未完待续。。。