实例分析浏览器中“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 相关文章推荐
jqPlot Option配置对象详解
Jul 25 Javascript
调用js时ie6和ie7,ff的区别
Aug 19 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
Dec 28 Javascript
javascript 操作cookies详解及实例
Feb 22 Javascript
VueJS事件处理器v-on的使用方法
Sep 27 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
WEB前端性能优化的7大手段详解
Feb 04 Javascript
Javascript中的解构赋值语法详解
Apr 02 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
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
PHP5常用函数列表(分享)
2013/06/07 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
PHP xpath()函数讲解
2019/02/11 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
非常详细的C#面试题集
2016/07/13 面试题
珍惜资源的建议书
2014/08/26 职场文书
公司经营目标责任书
2015/01/29 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
pandas数值排序的实现实例
2021/07/25 Python