美文网首页前端首页推荐
javascript基础之(令人捉摸不透的)作用域

javascript基础之(令人捉摸不透的)作用域

作者: 编程小飞侠 | 来源:发表于2016-09-02 22:05 被阅读50次

    相信学过javascript的童鞋们都知道作用域在在其中的重要性了,然而很多人在刚接触过作用域后,对于作用域的理解,可能都会有点似懂非懂,今天楼主就对
    作用域进行详细讲解,并附有各种面试考题例子,希望对于看过这篇文章的童鞋能有所帮助。

    首先:我们在字面上理解下作用域。

    作用:指“读 写”。
    域:指“空间、范围、区域......”。
    所以作用域可以理解为:在一个范围区域内进行读写操作。

    接下来:我们来模拟一下浏览器对于javascript的解析过程。

    首先我们要了解浏览器对javascript的解析是从上往下开始逐行解析的。
    对于浏览器:
    可将浏览器内部模拟出一个“JS解析器”
    (1):首先进行JS的预解析

    解析器会“找一些东西”:var(变量) function(函数) 参数

    比如找到一个变量a-> a=...(undefined)

    所有的变量,在正式运行代码之前,都会提前赋一个值:undefined。

    或者比如找到一个函数fn1-> fn1=function fn1(){alert(1);}
    所有的函数,在正式运行代码之前,都是整个函数块。

    遇到重名只留下一个,变量和函数名重名了,就只留下函数

    (2):解析器再逐行解读代码:

    碰到表达式可以修改预解析里的值。

    例:表达式:= - * / % ++ -- ! 参数......

    一个变量如果作用于整个作用域,则称这个变量为全局变量,作用域为全局函数
    一个变量如果只作用于一个函数内部,则称这个变量为局部变量,作用域为局部函数

    接下来通过各个例子,来对作用域进行更深刻的理解。

             //楼主就对第一个例子进行详细说明,接下来的例子希望童鞋们通过自己的理解来进行解答
    
              alert(a);       //        function a(){alert(2)}          
              var a=1;                                              //根据上面的解析过程 首先找到变量和函数,并给
              alert(a);        //      1                              变量赋上未定义,函数附上整个函数块。  
              function a(){alert(2);}                                   a=...  a=function a(){alert(2)}
              alert(a);       //     1                                因为变量名和函数名重名了,所以只留下函数。         
              var a=3;                                                  a=function a(){alert(2)}
              alert(a);       //     3                                再进行逐行解读代码
              function a(){alert(4);}                                      碰到表达式,可以修改预解析里的值
              alert(a);        //    3
    

    接下来楼主写下例子和答案,童鞋们可以根据以上步骤自己进行分析。

               var a=1;
               function fn1(){
                    alert(a);          //undefined
                    var a=2;
                 }
               fn1();
               alert(a);        //  1
     
    
              /*-----------------------------------*/
    
    
               var a=1;
               function fn1(){                  
                    alert(a);           //  1
                    a=2;                 �               函数:
                 }                                            由里往外找变量
               fn1();
               alert(a);          //   2
         
               /*-----------------------------------*/
    
               var a=1;
               function fn1(a){         
                    alert(a);           // undefined
                    a=2;                 �              
                 }                                           
               fn1();
               alert(a);          //  1
           
              /*-----------------------------------*/
    
               var a=1;
               function fn1(a){              
                    alert(a);           //  1
                    a=2;                 �              
                 }                                           
               fn1(a);
               alert(a);         //  1
    

    通过以上例子,相信大家对于作用域一定有了更加深刻的理解,那么楼主就出一道小题,答案大家可以写在评论里,或者简信给我。

                 <script>
                     window.onload=function(){
                       var oBtn=document.getElementsByTagName('input');
                       for(var i=0;i<3;i++){
                           oBtn[i].onclick=function(){
                           alert(i);
                         }
                                    }
           }
                </script>
    

    请大家告知alert(i)中i的值!!!

    相关文章

      网友评论

      本文标题:javascript基础之(令人捉摸不透的)作用域

      本文链接:https://www.haomeiwen.com/subject/ysrkettx.html