一、块级作用域的说明
在学习JavaScript的变量作用域之前,我们应当明确几点:
a、JavaScript的变量作用域是基于其特有的作用域链的。
b、JavaScript没有块级作用域。
c、函数中声明的变量在整个函数中都有定义。
javascript的变量作用域,与平时使用的类C语言不同,例如C#中的代码:
static void Main(string[] args) { if(true) { int number=10; } Console.WriteLine(number); }
这段代码进行编译,是无法通过的,因为"当前上下文不存在number".
因为这里变量的作用域是由花括号限定的,称为块级作用域。
在块级作用域下,所有的变量都在定义的花括号内,从定义开始到花括号结束这个范围内可以使用,出了这个范围就是无法访问,也就是说
if(true) { int number=10; Console.WriteLine(number); }
这样可以访问,因为变量的定义与使用在同一个花括号内。
但是在javascript中没有块级作用域的概念。
二、javascript中的作用域
1、函数限定变量作用域
在javascript中,函数里面定义的变量,,可以在函数里面被访问,但在函数外无法访问,代码:
<script type="text/javascript"> var num=function() { var number=10; }; try{ alert(number); }catch(e) { alert(e); } </script>
代码运行时,会抛出一个异常,变量number没有定义,是因为定义在函数中的变量无法再函数外使用,在函数内可以任意使用,即使在赋值之前:
<script type="text/javascript"> var num=function(){ alert(number); var number=10; alert(number); }; try{ num(); }catch(e){ alert(e); } </script>
这段代码运行后,不会抛出错误,弹出两次,分别是undefined和10
2.子域访问父域
函数可以限定变量的作用域,那么在函数中的函数就为该作用域的子域,在子域中的代码可以访问到父域中的变量,代码如下:
<script type="text/javascript"> var func=function(){ var number=10; var sub_func=function(){ alert(num); }; sub_func(); }; func(); </script>
这段代码执行得到的结果是10,但是在子域中访问父域的代码也是有条件的
<script type="text/javascript"> var func=function(){ var number=10; var sub_func=function(){ var num=20; alert(num); }; sub_func(); }; func(); </script>
内容版权声明:除非注明,否则皆为本站原创文章。