zoukankan      html  css  js  c++  java
  • 关于匿名函数,闭包和作用域链

    网上有很多关于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 这样的一个关系。

      未完待续。。。

      

  • 相关阅读:
    CodeForces 659F Polycarp and Hay
    CodeForces 713C Sonya and Problem Wihtout a Legend
    CodeForces 712D Memory and Scores
    CodeForces 689E Mike and Geometry Problem
    CodeForces 675D Tree Construction
    CodeForces 671A Recycling Bottles
    CodeForces 667C Reberland Linguistics
    CodeForces 672D Robin Hood
    CodeForces 675E Trains and Statistic
    CodeForces 676D Theseus and labyrinth
  • 原文地址:https://www.cnblogs.com/z-Relix/p/3620589.html
Copyright © 2011-2022 走看看