JavaScript中的作用域问题

c#中的作用域

c#中是块级作用域,变量的作用域是由花括号限定的。

1 static void Main(string[] args)
2     {
3         if(true)
4         {
5             int num = 10;
6         }
7         System.Console.WriteLine(num);
8     }

这段代码会报错,因为WriteLine无法访问到num。 
变量num定义在花括号里边,从定义开始到或括号结束这个范围可以使用,出了这个范围就无法访问。

1 if(true)
2     {
3         int num = 10;
4         System.Console.WriteLine(num);
5     }

 

这段代码可以运行,因为变量的定义和使用在同一个花括号内。

JavaScript中的作用域

在JavaScript中没有块级作用域

1 if(true) {
2         var num = 10;
3     }
4 alert(num);

结果是弹窗10 



在JavaScript只有函数可以限定一个变量的作用范围。也就是说,在JavaScript中,在函数里面定义的变量,可以在函数里面被访问,但在函数外无法访问。

 

在函数中使用了var定义变量,则为局部变量,它只存在这个函数的上下文中,反之,如果没有使用var,那个变量就将被视为一个全局变量。 
在函数外定义变量即使使用var,也为全局变量。 
建议全用var声明。

1 var func = function() {
2         var num = 10;
3 };
4 
5 alert(num);

这句话会报错,因为num未定义

嵌套函数中变量的作用域

在JavaScript中是可以在函数中定义函数的

1 var func = function() {
2         var num = 10;
3         var sub_func = function() {
4             var num = 20;
5             alert(num);
6         };
7         sub_func();
8     };
9 func();//20

 

显示结果为20,alert(num)的时候,会先在他所在函数里寻找是否有声明的var,有的话就用。

1 var func = function() {
2         var num = 10;
3         var sub_func = function() {
4             alert(num);
5         };
6         sub_func();
7     };
8 func();//10

 

显示结果为10,alert在当前sub_fun函数中没有找到num,于是就到上一级函数寻找。

1 var num=20;
2 var func = function() {
3         alert(num);
4         var num = 10;
5         alert(num);
6 };
7 func();

 

这段函数会显示什么? 
会弹出两个框,一个是undefined,一个是10 
第一个alert执行的时候会在当前函数中寻找是否有num定义,结果是有,但对num的赋值是在下一行代码才执行,所以num的值为undefined(即未定义)。 
第二个alert执行的时候也是会先在当前函数中寻找是否有num定义,结果是有,并且已经赋值,所以num的值为10。 
上面这段代码就相当于

1 var num=20;
2 var func = function() {
3         var num;
4         alert(num);
5         var num = 10;
6         alert(num);
7 };
8 func();

如果在函数中没有声明num的话,就会往上找。

1 var num=20;
2 var func = function() {
3         alert(num);
4 };
5 func();

打印结果为20

因此在实际开发的时候,推荐将变量都写在开始的的地方。 
jQuery库中就是这么完成的。

 1 jQuery.extend = jQuery.fn.extend = function() {
 2     var src, copyIsArray, copy, name, options, clone,
 3         target = arguments[0] || {},
 4         i = 1,
 5         length = arguments.length,
 6         deep = false;
 7 
 8     // Handle a deep copy situation
 9     if ( typeof target === "boolean" ) {
10         deep = target;
11         target = arguments[1] || {};
12         // skip the boolean and the target
13         i = 2;
14     }
15     ....

这是在jQuery中截取的一段代码,在这个函数的开头就都把变量定义好了。

===================还不够完善,先mark在这里,以后再来补充2017.3.13==============

posted @ 2017-03-13 16:53  TwoYoung  阅读(244)  评论(0编辑  收藏  举报