理解 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 相关文章推荐
Javascript客户端脚本的设计和应用
Aug 21 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
$.get获取一个文件的内容示例代码
Sep 11 Javascript
js对table的td进行相同内容合并示例详解
Dec 27 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
Jun 16 Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 Javascript
莱鸟介绍window.print()方法
Jan 06 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
JS apply用法总结和使用场景实例分析
Mar 14 Javascript
VUE中setTimeout和setInterval自动销毁案例
Sep 07 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面向对象之多态
2014/08/20 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
在Python中表示一个对象的方法
2019/06/25 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python实现大文件分割与合并
2019/07/22 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
中科创达面试题
2016/12/28 面试题
JAVA软件工程师测试题
2014/07/25 面试题
学习党课思想汇报
2013/12/29 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
提拔干部考察材料
2014/05/26 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
中考百日冲刺决心书
2015/09/22 职场文书