理解 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的滚动新闻列表
Jun 19 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
javascript全局变量封装模块实现代码
Nov 28 Javascript
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
Javascript获取表单名称(name)的方法
Apr 02 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
小程序实现留言板
Nov 02 Javascript
vue接入腾讯防水墙代码
May 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函数的实现原理及性能分析(二)
2015/05/13 PHP
Js中sort()方法的用法
2006/11/04 Javascript
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
php跨域调用json的例子
2013/11/13 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
解决python 上传图片限制格式问题
2019/10/30 Python
基于python 取余问题(%)详解
2020/06/03 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
材料化学应届生求职信
2013/10/09 职场文书
信息工程学院毕业生推荐信
2013/11/05 职场文书
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
加工操作管理制度
2014/01/19 职场文书
培训督导岗位职责
2015/04/10 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
离职信范文
2015/06/23 职场文书
葬礼主持词
2015/07/02 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB