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

网上有很多关于javascript作用域链和闭包的解释说明,但大多数都是风格统一的例子解释,看的多了也就烦了,所以以这篇笔记来梳理自己的理解,如果有觉得不对的,希望可以指出,共勉。

 

首先说下作用域的问题:

  以线段来比喻作用域的初始状态,原始的作用域链就是一个实心点,代表window这个全局环境,这个就是最原始的执行环境

  如果在window环境下执行,var a = ‘this is window’ 或者 a = 'this is window',那么a这个变量就隶属于window

  因为js中不存在块级语法,所以像条件,循环语句是不能新建一个执行环境的,也就是说下面的定义最后都属于window

  

 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,他们始终还是属于window

 

  那什么情况下,会改变代码的执行环境? 那就是函数,也只有函数能新建执行环境,包括一般函数,匿名函数等等,只要是函数,就会自动在当前执行环境下新建一个执行环境。

 

  

function b(){
    // code  
}

function c(){
    // code  
}

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

  以上共新建了4个新的执行环境,可以看成四个点,首先按照顺序 点window—— 点b —— 点c —— 点d ,很明确,b,c,d属于window执行环境下,而且都在window之前,中间的——就带表自己的环境域

  点window是看不到点b之前的——(环境域),包括点c和点d的,所以既然看不到也就无法使用,但是,点d却能看到点window的,这就形成了作用域链。

  最后 点e在点d中,所以就是 点d —— 点e 这样的一个关系。

 

  未完待续。。。

  

posted @ 2014-03-24 12:37  zRelix  阅读(323)  评论(1编辑  收藏  举报