理解 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 相关文章推荐
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
jQuery判断密码强度实现思路及代码
Apr 24 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
javascript 获取HTML DOM父、子、临近节点
Jun 16 Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
Angularjs中controller的三种写法分享
Sep 21 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
详解vue中多个有顺序要求的异步操作处理
Oct 29 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下实现折线图效果的代码
2007/04/28 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Sublime开发python程序的示例代码
2018/01/24 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
python进程和线程用法知识点总结
2019/05/28 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
python 下划线的不同用法
2020/10/24 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
品质标语大全
2014/06/21 职场文书
房产协议书范本2014
2014/09/30 职场文书
师德师风整改措施
2014/10/24 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
python如何做代码性能分析
2021/04/26 Python