您的位置:首页 > Web前端 > JavaScript

Javascript之预编译

2015-12-22 19:52 483 查看
Javascript的预编译与我们所说的编译是不相同的。

那么什么是JavaScript的“预编译”?

function lsl() {
alert("li");
};
lsl(); //这里调用lsl,输出sulong而不是li

function lsl() {
alert("sulong");
};
lsl(); //这里调用lsl,当然输出sulong


按理说,两个签名完全相同的函数,在其他编程语言中应该是非法的。但在JavaScript中,这没错。不过,程序运行之后却发现一个奇怪的现象:两次调用都只是最后那个函数里输出的值!显然第一个函数没有起到任何作用。这又是为什么呢?

JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地进行预编译后让后 再执行的。而且,在同一段程序中,函数 在被执行之前 会被预定义,后定定义的 同名函数 会覆盖 先定义的函数。在调用函数的时候,只会调用后一个预定义的函数(因为后一个预定义的函数把前一个预定义的函数覆盖了)。也就是说,在第一次调用lsl之前,第一个函数语句定义的代码逻辑,已被第二个函数定义语句覆盖了。所以,两次都调用都是执行最后一个函数逻辑了。

//第一段代码
<script>
function lsl() {
alert("li");
};
lsl(); //li
</script>

//第二段代码
<script>
function lsl() {
alert("sulong");
};
lsl(); //sulong
</script>


一段代码中的定义式函数语句会优先执行,这似乎有点象静态语言的编译概念。所以,这一特征也被有些人称为:JavaScript的“预编译”
所以总结下:JS 解析器在执行语句前会将函数声明和变量定义进行"预编译",而这个"预编译",并非一个页面一个页面地"预编译",而是一段一段地预编译,所谓的段就是一 个 <script> 块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: