1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错)
2.js的预编辑:【对定义式函数】直接创建为作用域上的函数变量,并将其值初始化为定义的函数代码逻辑,也就是为其建立了可调用的函数变量。
3.js的预编辑:【对var定义的变量】 会在开始先全部找出来,并且将初始值设为undefined
4.【对上面代码的解释】:第一个yourname是undefined:在js开始解析时获得了第一行的yourname声明和函数内部的yourname声明,也就是说在函数内部的局部变量里yourname是被声明过的,然后他们被赋予undefined(等待进一步赋值),然而在函数内部时调用在前赋值在后,所以显示的是undefined;
5.最后一行仍然是“李战”:js倾向于先在当前作用域中找函数或变量,如果没有的话再到上层去找,以此类推
最后贴几个很好的例子:
1 alert(testNum); 2 alert('ok'); 3 testNum = 2; 4 //testNum未声明,执行报错。 5 alert(testNum); 6 alert('ok'); 7 var testNum = 2; 8 //弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。 9 testFunc(); 10 function testFunc() {} 11 alert('ok'); 12 //弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。 13 testFunc(); 14 var testFunc = function() {}; 15 alert('ok'); 16 //testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。 17 18 19 20 <script type="text/javascript"> 21 testFunc(); 22 alert('first block'); 23 <!--script--> 24 <script type="text/javascript"> 25 alert('second block'); 26 <!--script--> 27 //弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。 28 29