前端首页推荐

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

2016-09-02  本文已影响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的值!!!

上一篇下一篇

猜你喜欢

热点阅读