实例分析浏览器中“JavaScript解析器”的工作原理


Posted in Javascript onDecember 12, 2016

浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作。

JavaScript解析器工作步骤:

1、“找一些东西”: var、 function、 参数;(也被称之为预解析)

备注:如果遇到重名分为以下两种情况:

  • 遇到变量和函数重名了,只留下函数
  • 遇到函数重名了,根据代码的上下文顺序,留下最后一个

2、逐行解读代码。

备注:表达式可以修改预解析的值

JS解析器在执行第一步预解析的时候,会从代码的开始搜索直到结尾,只去查找var、function和参数等内容。一般把第一步称之为“JavaScript的预解析”。而且,当找到这些内容时,所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;所有的函数,在正式运行代码之前,都是整个函数块。

实例分析:

实例一:

<!DOCTYPE html>
 <html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script type="text/javascript">
 alert(a);
 </script>
</head>
 <body>
 </body>
</html>

这段代码运行后,浏览器会报错。

原因:由于,“JavaScript解析器”在解析JS代码时,未找到var、function、参数等其中的任何一个,所以,当逐行执行代码时,因为在“仓库”中找不到a,不认识a,就会报错。

实例二:

<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script type="text/javascript">
 alert(a);
 var a = 1;
 </script>
 </head>
 <body>
 </body>
 </html>

这段代码运行后,浏览器会弹出”undefined”。

原因:由于,“JavaScript解析器”在解析JS代码时,找到var关键字,然后得知有一个变量a,所以会给a默认赋值一个undefined值,存入“仓库”中,所以,当逐行执行代码时,找到变量a,因为此时的a的值为undefined,所以弹出的值为undefined。

实例三:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script type="text/javascript">
 var a = 1;
 alert(a);
 </script>
</head>
<body>
</body>
</html>

这段代码运行后,浏览器会弹出数字“1”。

原因:由于,“JavaScript解析器”在解析JS代码时,找到var关键字,然后得知有一个变量a,所以会给a默认赋值一个undefined值,存入“仓库”中,在逐行执行代码时,先找到变量a,此时的a的值为undefined,当执行到var a= 1 这行代码时,a得到了一个新的赋值“1”所以弹出的值为数字“1”。

实例四:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script type="text/javascript">
 alert(a);
 var a = 1;
 alert(a);
 function a () {
 alert(2);
 }
 alert(a);
 var a = 3;
 alert(a);
 function a () {
 alert(4);
 }
 alert(a);
 </script>
</head>
<body>
</body>
</html>

这段代码运行后,弹出值的顺序依次为:function a () {alert(4);}、1、1、3、3

原因:由于,“JavaScript解析器”在逐行解析代码时,先找到var关键字,然后得知有一个变量a,所以会给a默认赋值一个undefined值,存入“仓库”中,然后,继续向下解析代码,当找到function a () {alert(2);}时,根据“函数和变量重名,保留函数”的规则,此时的a变为function () {alert(2);},再继续向下找,当找到变量a的时候,不变,仍继续向下找,当找到函数function () {alert(4);}时,根据“函数重名上下文”原则,替换为function () {alert(4);},最终a被赋值为function () {alert(4);},存到“仓库”中,当逐行执行代码时,执行到第一个alert(a)时,将会弹出“function () {alert(4);}”,接着向下执行,当执行到a=1时,由于表达式可以改变预解析的值,所以此时的a变为1,执行到第二个alert(a)时,弹出值为1,当执行到function a () {alert(2);}时,由于此时是一个函数声明,并不会修改a的值,所以执行到第三个alert(a)时,弹出的仍为数字“1”,依次类推,此后将会陆续弹出“3”、“3”。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
告诉大家什么是JSON
Jun 10 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
Mar 06 Javascript
dwz 如何去掉ajaxloading具体代码
May 22 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
Sep 13 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
Oct 17 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 Javascript
JS使用eval()动态创建变量的方法
Jun 03 Javascript
jQuery实现标签页效果实战(4)
Feb 08 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
JS双击变input框批量修改内容
Dec 12 #Javascript
jQuery中animate的几种用法与注意事项
Dec 12 #Javascript
Websocket协议详解及简单实例代码
Dec 12 #Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 #Javascript
jQuery实现字符串全部替换的方法
Dec 12 #Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 #Javascript
简单实现jquery焦点图
Dec 12 #Javascript
You might like
php提交表单发送邮件的方法
2015/03/20 PHP
prototype class详解
2006/09/07 Javascript
双击滚屏-常用推荐
2006/11/29 Javascript
Javascript 对象的解释
2008/11/24 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
vue组件生命周期详解
2017/11/07 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
python3实现名片管理系统
2020/11/29 Python
Python截图并保存的具体实例
2021/01/14 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
编辑硕士自荐信范文
2013/11/27 职场文书
小学生评语大全
2014/04/18 职场文书
正科级干部考察材料
2014/05/29 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
入党综合考察材料
2014/06/02 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
党委领导班子整改方案
2014/09/30 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
python中取整数的几种方法
2021/11/07 Python