详解JS中的作用域

Javascript ZackZhong 1973℃ 0评论

 

     我们知道javascript中存在两条链,作用域链和原型链,之前一直模模糊糊,
    今天复习JS高级程序设计3时,打算写文章整理一下,加深理解.

    // var a=1; //全局对象 ①
     var fn1=function(){
         //var a=2; // ②
         function fn2(){
            //var a=3;// ③ ⑥⑦⑧⑨⑩⑪⑫
            console.log(a);
         }
         fn2();//调用fn2
     };

     var fn4=function(){
        var a=6;// ④
        function fn5(){
          var a=7;// ⑤
          console.log(a);
        }
        fn5();
     }
    //先看fn1函数执行过程
    fn1(); // 3 在③处找到了a
    /*
      把③注释掉,执行结果为2,在②处找到了a
      把②注释掉,执行结果为1,在①处找到了a
      把①注释掉, 执行结果为 ReferenceError: a is not defined 结果找不到了
    */
   看这个图:
  

    //同样的,执行fn4,按上面的分析流程也可以得到相似的结果
    
     总结:每一个<script>标签下的变量和函数存放在0级作用域,
          <script>下的每一个函数为1级作用域,1级作用域下的再定义一个函数,
          为2级作用域,2级作用域再定义一个函数为3级作用域,1级作用域下嵌套n层函数为n+1层作用域,
          单独说有些抽象,举个例子:
      
        //=============分割线====================
        <script>
            var b=0; //0级作用域
            function fn1(){
               var b2=2;
               function fn2(){
                  var b3=3;
                  function fn3(){

                  }
                  function fn4(){

                  }
               }
            }
            
            //fn1为1级作用域,fn2为2级作用域,fn3为3级作用域
              
         
              fn3为函数fn1的两层嵌套函数,fn1的为1级作用域
              所以fn3的作用域为n+1=2+1=3;
              同理,fn4也为3级作用域。

            作用域链的查找过程:  
              当查找某个变量时,首先在当前的作用域查找,如果找到了,就使用,
              整个查找过程结束,否则,则沿着作用域链向上一层(0级>1级>2级>3级>4级>····n级)
             查找到则使用,否则继续沿着作用域链向上一层查找,直到0级作用域。
             0级作用域为作用域的顶端,0级作用域中还没找到,则返回 ReferenceError: a is not defined
             整个查找过程结束
         
      </script>

转载请注明:副业 and 脱单研究所 » 详解JS中的作用域

喜欢 (11)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址