Javascript的预编译与我们所说的编译是不相同的。
那么什么是JavaScript的“预编译”?
function lsl() {
alert("li");
};
lsl(); //这里调用lsl,输出sulong而不是li
function lsl() {
alert("sulong");
};
lsl(); //这里调用lsl,当然输出sulong
JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地进行预编译后让后 再执行的。而且,在同一段程序中,函数 在被执行之前 会被预定义,后定定义的 同名函数 会覆盖 先定义的函数。在调用函数的时候,只会调用后一个预定义的函数(因为后一个预定义的函数把前一个预定义的函数覆盖了)。也就是说,在第一次调用lsl之前,第一个函数语句定义的代码逻辑,已被第二个函数定义语句覆盖了。所以,两次都调用都是执行最后一个函数逻辑了。
//第一段代码
<script>
function lsl() {
alert("li");
};
lsl(); //li
</script>
//第二段代码
<script>
function lsl() {
alert("sulong");
};
lsl(); //sulong
</script>
一段代码中的定义式函数语句会优先执行,这似乎有点象静态语言的编译概念。所以,这一特征也被有些人称为:JavaScript的“预编译”
所以总结下:JS 解析器在执行语句前会将函数声明和变量定义进行"预编译",而这个"预编译",并非一个页面一个页面地"预编译",而是一段一段地预编译,所谓的段就是一 个 <script> 块。