理解 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 相关文章推荐
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 Javascript
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
jQuery大于号(&gt;)选择器的作用解释
Jan 13 Javascript
jQuery实现的分页功能示例
Jan 22 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
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
综合图片计数器
2006/10/09 PHP
PHP的FTP学习(四)
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
vue生命周期实例小结
2018/08/15 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
如何在python中实现随机选择
2019/11/02 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
西安事变观后感
2015/06/12 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript