实例分析浏览器中“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 相关文章推荐
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
详解Angularjs中的依赖注入
Mar 11 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
jquery自定义显示消息数量
Dec 19 jQuery
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 Javascript
在 Vue.js中优雅地使用全局事件的方法
Feb 01 Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 Javascript
详解Vscode中使用Eslint终极配置大全
Nov 08 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP时间处理类操作示例
2018/09/05 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
原生JS实现LOADING效果
2015/03/16 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python实现倒计时的示例
2014/02/14 Python
深入讲解Python编程中的字符串
2015/10/14 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
python 实现客户端与服务端的通信
2020/12/23 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
患者身份识别制度
2015/08/06 职场文书
Mybatis是这样防止sql注入的
2021/12/06 Java/Android
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers