理解 JavaScript 预解析


Posted in Javascript onOctober 25, 2009

事实上或某种现象证明并不是这样的,通过《JavaScript权威指南》及网上相关资料了解到,JavaScript有“预解析”行为。理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在。为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正。
(1)如果JavaScript仅是运行时自上往下逐句解析的,下面的代码能正确运行是可以理解的,因为我们先定义函数,然后才调用它。

function showMsg() 
{ 
alert('This is message'); 
} 
showMsg(); // This is message

(2)我们也知道函数可以定义在调用代码之后,如下代码也是能正常工作的。看起来调用showMsg()的时候showMsg()还是没有定义的,但能正常工作,则表明JavaScript是“预解析”的。
showMsg(); // This is message 
function showMsg() 
{ 
alert('This is message'); 
}

(3)上面是函数的例子,下面再来一个普通变量的例子。以下例子运行将会弹出undefined,表明第一句的msg已经是定义了,只是没有初始化,它与var msg; alert(msg);是一样的。如果你把下面第二句注释掉,则会报“msg未定义”错误。这亦表明JavaScript是“预解析”的。
alert(msg); //undefined 
var msg='This is message';

(4)再来看一个例子,加深对JavaScript“预解析”印象。以下代码你将看到两次弹出的对话框都是显示This is message 2,为什么会这样呢?其实下面一前一后定义了两个同名函数,后面的showMsg()覆盖了前面定义的(在JavaScript中,同名变量一样会存在覆盖问题),等于第一个showMsg()报废了。为什么第二次调用的showMsg()不是调用它上面定义的那个message 1函数呢?这再次证明JavaScript有“预解析”行为。
showMsg(); // This is message 2 
function showMsg() 
{ 
alert('This is message 1'); 
} 
showMsg(); // This is message 2 
function showMsg() 
{ 
alert('This is message 2'); 
}

(5)JavaScript“预解析”是把变量或函数预解析到它们能调用的环境(变量运行时环境)中。如下代码看起来alert(msg)之前有看到msg的定义,但是程序运行还是报“msg未定义”错误,这是因为函数里定义的变量是函数的私有变量,外面不能直接调用,这表明JavaScript“预解析”并不是把所有定义的变量统一解析到一个全局对象中,比如window。
function showMsg() 
{ 
var msg='This is message'; 
} 
alert(msg); // msg未定义

(6)JavaScript“预解析”是分段进行的,准确说是分<script>块进行的。以下代码出现在同一个页面的两个脚本块中,同时定义了三个同名函数。程序运行结果表明第二个脚本块的showMsg()没有覆盖前面两个showMsg(),而第一个脚本块的第二个showMsg()则覆盖了第一个showMsg()。
<body> 
<script type="text/javascript"> 
showMsg(); //This is message 2 
function showMsg() 
{ 
alert('This is message 1'); 
} 
function showMsg() 
{ 
alert('This is message 2'); 
} 
</script> 
<script type="text/javascript"> 
function showMsg() 
{ 
alert('This is message 3'); 
} 
</script> 
</body>

作者:WebFlash
出处:http://webflash.cnblogs.com
Javascript 相关文章推荐
十个迅速提升JQuery性能让你的JQuery跑得更快
Dec 10 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
javascript常用函数(2)
Nov 05 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
jQuery点击其他地方时菜单消失的实现方法
Apr 22 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
javascript数组去重方法分析
Dec 15 Javascript
js数字舍入误差以及解决方法(必看篇)
Feb 28 Javascript
js模拟支付宝密码输入框
Apr 11 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 Javascript
JavaScript实现移动端拖动元素
Nov 24 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
Oct 25 #Javascript
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
Oct 25 #Javascript
javascript window对象属性整理
Oct 24 #Javascript
Javascript 模式实例 观察者模式
Oct 24 #Javascript
Jquery 弹出层插件实现代码
Oct 24 #Javascript
js 操作符实例代码
Oct 24 #Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 #Javascript
You might like
php 正则匹配函数体
2009/08/25 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python利用datetime模块计算时间差
2015/08/04 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
如何基于Python批量下载音乐
2019/11/11 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
优秀员工自荐书范文
2013/12/08 职场文书
共产党员承诺书
2014/03/25 职场文书
青春励志演讲稿
2014/04/29 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
优秀教师事迹材料
2014/12/15 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书
导游词之包公祠
2019/11/25 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js