关于匿名函数,闭包和做用域链

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

 

  未完待续。。。

相关文章
相关标签/搜索