Javascript之预编译
2015-12-22 19:52
483 查看
Javascript的预编译与我们所说的编译是不相同的。
那么什么是JavaScript的“预编译”?
按理说,两个签名完全相同的函数,在其他编程语言中应该是非法的。但在JavaScript中,这没错。不过,程序运行之后却发现一个奇怪的现象:两次调用都只是最后那个函数里输出的值!显然第一个函数没有起到任何作用。这又是为什么呢?
JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地进行预编译后让后 再执行的。而且,在同一段程序中,函数 在被执行之前 会被预定义,后定定义的 同名函数 会覆盖 先定义的函数。在调用函数的时候,只会调用后一个预定义的函数(因为后一个预定义的函数把前一个预定义的函数覆盖了)。也就是说,在第一次调用lsl之前,第一个函数语句定义的代码逻辑,已被第二个函数定义语句覆盖了。所以,两次都调用都是执行最后一个函数逻辑了。
一段代码中的定义式函数语句会优先执行,这似乎有点象静态语言的编译概念。所以,这一特征也被有些人称为:JavaScript的“预编译”
所以总结下:JS 解析器在执行语句前会将函数声明和变量定义进行"预编译",而这个"预编译",并非一个页面一个页面地"预编译",而是一段一段地预编译,所谓的段就是一 个 <script> 块。
那么什么是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> 块。
相关文章推荐
- 分享:JavaScript常见面试题
- JSON
- Javascript History对象
- phantomjs学习资料
- WebSocket的JavaScript例子
- JSP/Servlet-----charset 、pageEncoding差别
- JS获取倒计时时间的方法
- 人生第一篇博客,求支持。 对EL表达式和JSTL标签库和OGNL表达式的了解
- $.jsonp
- jsonp原理
- js 页面之间的跳转、传参以及返回上一页
- 小技巧之js导出word
- json-lib 之jsonConfig详细使用
- 小技巧之js判定上传文件大小
- js之第三方工具解析JSON
- jsp页面静态化实例
- JsonUtil
- JavaScript当中网页刷新后数值(text、radio、checkbox、select、textarea)保持不变(输入域数据保持)的简单方法
- js仿微博实现统计字符和本地存储功能
- js 上传图片预览 在网上找的例子,很好使