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==============