js的预编译机制

时间:2023-03-09 18:48:19
js的预编译机制

js的预编译机制

1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错)

2.js的预编辑:【对定义式函数】直接创建为作用域上的函数变量,并将其值初始化为定义的函数代码逻辑,也就是为其建立了可调用的函数变量。

3.js的预编辑:【对var定义的变量】 会在开始先全部找出来,并且将初始值设为undefined

4.【对上面代码的解释】:第一个yourname是undefined:在js开始解析时获得了第一行的yourname声明和函数内部的yourname声明,也就是说在函数内部的局部变量里yourname是被声明过的,然后他们被赋予undefined(等待进一步赋值),然而在函数内部时调用在前赋值在后,所以显示的是undefined;

5.最后一行仍然是“李战”:js倾向于先在当前作用域中找函数或变量,如果没有的话再到上层去找,以此类推

最后贴几个很好的例子:

     alert(testNum);
alert('ok');
testNum = 2;
//testNum未声明,执行报错。
alert(testNum);
alert('ok');
var testNum = 2;
//弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。
testFunc();
function testFunc() {}
alert('ok');
//弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。
testFunc();
var testFunc = function() {};
alert('ok');
//testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。   <\script type="text/javascript">
testFunc();
alert('first block');
<!--\script-->
<\script type="text/javascript">
alert('second block');
<!--\script-->
//弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。