理解 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 相关文章推荐
Extjs Ajax 乱码问题解决方案
Apr 15 Javascript
js 图片缩放(按比例)控制代码
May 27 Javascript
js 禁用只读文本框获得焦点时的退格键
Apr 25 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
js实现九宫格图片半透明渐显特效的方法
Feb 16 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 Javascript
JavaScript函数节流的两种写法
Apr 07 Javascript
Vue from-validate 表单验证的示例代码
Sep 26 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 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和ACCESS写聊天室(二)
2006/10/09 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
python实现抖音点赞功能
2019/04/07 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
申报材料格式
2014/12/30 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python