今天学习这个js,在js中发现声明的变量使用的这个过程并不像在C#中如果使用变量一定要先声明的形式,在js中变量的声明在你方法中任何地方声明后,你在方法开始处就调用这个变量也可以,
可以看一下下面的代码
var func = function() { var num = 10; var sub_func = function() { alert(num); var num = 20; alert(num); }; sub_func(); }; func();
//
可以看到在这个方法中最后输出的结果是多少呢?
在第一个alert输出的结果是 undefined,而第二个alert输出的结果就是20,请问为什么?
因为在这个代码中 sub_func方法中的第一个alert在去调用num的时候去到了他所在的这个方法中寻找是否有这个名字的变量,如果在当前的方法域中找到这个变量就使用这个变量,如果没有就去到上一级的父级域中去搜索,如果搜索到就使用父级域的变量,那么可以看到我们sub_func这个方法中是有num这个变量的,其实这个代码的等效形式是这样的
var func = function() { var num = 10; var sub_func = function() { var num; alert(num); num = 20; alert(num); }; sub_func(); }; func();
/
可以看到,在这个sub_func方法中的 num其实是在方法的一开始就进行了声明,只是没有赋值而已,而到了下面num就进行了一个赋值操作而已,所以在js中声明变量一定要在最一开始就进行声明,否则就会出现第一个代码段的情况。js并不像在C#中那样,编译环境会提示告诉调用的变量有问题,因为代码是按照循序执行他并有在它上一级找到这个变量。
那么可以看一下下面这个代码它的输出值
var func = function() { var num = 10; var sub_func = function() { var num = 20; alert(num); }; sub_func(); }; func();
这一个的输出参数就是20,为什么,因为他在sub_func这个方法中找到了num这个变量,所以输出结果为20,那么如果这个sub_func方法中并没有num的话输出的就是父级域的num值了。
所以在js中方法的变量使用时一定要先声明,一定要声明在变量的开始位置。不然就可能会出现上述的情况。