实例分析浏览器中“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 相关文章推荐
脚本收藏iframe
Jul 21 Javascript
javascript显示选择目录对话框的代码
Nov 10 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
详解参数传递四种形式
Jul 21 Javascript
jQuery实现hover合成事件的方法
Aug 06 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
Sep 05 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
收藏AngularJS中最重要的核心功能
Jul 09 Javascript
vue 自定义 select内置组件
Apr 10 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
基于simple_html_dom的使用小结
2013/07/01 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
PHP函数超时处理方法
2016/02/14 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
jQuery代码优化 事件委托篇
2011/11/01 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
对python周期性定时器的示例详解
2019/02/19 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
中英双版中文教师求职信
2013/10/27 职场文书
党员年终民主评议的自我评价
2013/11/05 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
2015新学期家长寄语
2015/02/26 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
nginx配置限速限流基于内置模块
2022/05/02 Servers
JavaScript实现简单的音乐播放器
2022/08/14 Javascript