1.预编译与执行顺序的关系
当js引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理:
(1).所有变量:对所有变量进行声明,但未进行初始化以及赋值。
变量初始化发生在执行期,而不是预编译期
(2). 函数:声明函数,所以在执行期可以直接调用函数
所以,当js解释器执行下面脚本时也不会报错:变量a在预编译期已经声明了,只是还没初始化
此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值
(1)
<script type=
"text/javascript"
>
Fn();
//执行结果:"执行了函数2",同名函数后者会覆盖前者
function Fn(){
//函数1
alert(
"执行了函数1"
);
}
function Fn(){
//函数2
alert(
"执行了函数2"
);
}
</script>
|
(2)
<script type=
"text/javascript"
>
Fn();
//执行结果:"执行了声明式函数",在预编译期声明函数及被处理了,所以即使Fn()调用函数放在声明函数前也能执行。
function Fn(){
//声明式函数
alert(
"执行了声明式函数"
);
}
var Fn = function(){
//赋值式函数
alert(
"执行了赋值式函数"
);
}
</script>
(3)//代码块一
<script type=
"text/javascript"
>
alert(str);
//浏览器报错,但并没有弹出信息窗
</script>
//代码块二
<script type=
"text/javascript"
>
alert(str);
//弹窗"undefined"
var str =
"aaa"
;
</script>
//js在预处理期对变量进行了声明处理,但是并没有进行初始化与赋值,所以导致代码块二中的变量是unfiened的,而代码一中的变量是完全不存在的,所以浏览器报错。