理解 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 17 Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 Javascript
浏览器的JavaScript引擎的识别方法
Oct 20 Javascript
Js表格万条数据瞬间加载实现代码
Feb 20 Javascript
jquery实现右键菜单插件
Mar 29 Javascript
js实现精美的图片跟随鼠标效果实例
May 16 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 Javascript
浅析JS中什么是自定义react数据验证组件
Oct 19 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 ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
js中开关变量使用实例
2017/02/24 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
python3.3实现乘法表示例
2014/02/07 Python
Python快速从注释生成文档的方法
2016/12/26 Python
python logging日志模块的详解
2017/10/29 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python两个list[]相加的实现方法
2020/09/23 Python
中学老师的自我评价
2013/11/07 职场文书
社区先进事迹材料
2014/05/19 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
初中差生评语
2014/12/29 职场文书
最美乡村教师观后感
2015/06/11 职场文书
法制教育观后感
2015/06/17 职场文书
小学体育组工作总结
2015/08/13 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript