理解 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 原型学习总结
Oct 29 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
javascript实现表格增删改操作实例详解
May 15 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
浅谈JS之iframe中的窗口
Sep 13 Javascript
浅谈js中function的参数默认值
Feb 20 Javascript
javascript 中null和undefined区分和比较
Apr 19 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
Dec 08 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
Layui实现主窗口和Iframe层参数传递
Nov 14 Javascript
vue中的使用token的方法示例
Mar 10 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作为网站开发语言的原因分享
2012/01/03 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
javascript一些实用技巧小结
2011/03/18 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
进一步探究Python的装饰器的运用
2015/05/05 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
python实现名片管理系统
2018/11/29 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
python对Excel的读取的示例代码
2020/02/14 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
幼教求职信
2014/03/12 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
工作岗位职责范本
2015/02/15 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
宝塔更新Python及Flask项目的部署
2022/04/11 Python
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android