理解 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 获取事件对象的注意点
Jul 29 Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 Javascript
用JavaScript获取页面文档内容的实现代码
Jun 10 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
Apr 19 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
Jul 18 Javascript
Vue.js中的组件系统
May 30 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导出oracle库的php代码
2009/04/20 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
Java基础知识面试题
2014/03/25 面试题
大学生优秀团员事迹材料
2014/01/30 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
分公司负责人任命书
2014/06/04 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
八达岭长城导游词
2015/01/30 职场文书
高温慰问简报
2015/07/21 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Java界面编程实现界面跳转
2022/06/16 Java/Android