Javascript中的作用域及块级作用域

  

  

在学习JavaScript的变量作用域之前,我们应当明确几点:

  

, JavaScript的变量作用域是基于其特有的作用域链的。

  

b, JavaScript没有块级作用域。

  

c函数中声明的变量在整个函数中都有定义。

  

,javascript的变量作用域,与平时使用的类C语言不同,例如c#中的代码:

        静态void Main (string [] args)   {   如果(真)   {   int数=10;   }   Console.WriteLine(数量);   }      

,这段代码进行编译,是无法通过的,因为“当前上下文不存在的数字”。

  

,因为这里变量的作用域是由花括号限定的,称为块级作用域。

  

,,,,,,在块级作用域下,所有的变量都在定义的花括号内,从定义开始到花括号结束这个范围内可以使用,出了这个范围就是无法访问,也就是说

        如果(真)   {   int数=10;   Console.WriteLine(数量);   }      

这样可以访问,因为变量的定义与使用在同一个花括号内。

  

但是在javascript中没有块级作用域的概念。

  

  

, 1日函数限定变量作用域

  

,,,,,,在javascript中,函数里面定义的变量,,可以在函数里面被访问,但在函数外无法访问,代码:

        & lt;脚本type=" text/javascript祝辞   var num=function ()   {   var=10;   };   尝试{   警报(数量);   }捕捉(e)   {   警报(e);   }   & lt;/script>      

,,,代码运行时,会抛出一个异常、变量数量没有定义,是因为定义在函数中的变量无法再函数外使用,在函数内可以任意使用,即使在赋值之前:

        & lt;脚本type=" text/javascript祝辞   var num=function () {   警报(数量);   var=10;   警报(数量);   };   尝试{   num ();   }捕捉(e) {   警报(e);   }   & lt;/script>      

,,,这段代码运行后,不会抛出错误,弹出两次,分别是定义和10

  

<强>,2。子域访问父域

  

,,,,函数可以限定变量的作用域,那么在函数中的函数就为该作用域的子域,在子域中的代码可以访问到父域中的变量,代码如下:

        & lt;脚本type=" text/javascript祝辞   var func=function () {   var=10;   var sub_func=function () {   警报(num);   };   sub_func ();   };   func ();   & lt;/script>      

,这段代码执行得到的结果是10,但是在子域中访问父域的代码也是有条件的

        & lt;脚本type=" text/javascript祝辞   var func=function () {   var=10;   var sub_func=function () {   var num=20;   警报(num);   };   sub_func ();   };   func ();   & lt;/script>      

这段代码比前面多了一个“var num=20;”,这句代码在子域中,那么子域访问父域的情况就发生了变化,这段代码打印的结果是20,此时子域访问的num是子域中的变量,而不是父域中的。由此可见访问有一定规则可言,在javascript中使用变量,javascript解释器首先在当前作用域中搜索是否有该变量的定义,如果有,就是用这个变量,如果没有就到父域中寻找变量,依次类推,直到最顶级作用域,仍然没有找到就抛出异常“变量未定义”,代码如下:

        & lt;脚本type=" text/javascript祝辞   (函数(){   var num=10;   (函数(){   var num=20;   (函数(){   警报(num);   })();   })();   })();   & lt;/script>      

这段代码执行后打印出20,如果将“<代码> var num=20 ”取掉,那么打印的就是10。同样去掉“<代码> var num=10>   

  

作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。讲到这里,首先理解两个概念:块级作用域与函数作用域。
  

  

  

任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
  

  

函数作用域就好理解了(* ^ __ ^ *),定义在函数中的参数和变量在函数外部是不可见的。
  

  

大多数类C语言都拥有块级作用域,JS却没有。请看下文演示:

Javascript中的作用域及块级作用域