实例分析浏览器中“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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
jQuery监控文本框事件并作相应处理的方法
Apr 16 Javascript
js上传图片及预览功能实例分析
Apr 24 Javascript
JS中获取函数调用链所有参数的方法
May 07 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
JavaScript、jQuery与Ajax的关系
Jan 24 Javascript
JavaScript的this关键字的理解
Jun 18 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
js判断是否为空和typeof的用法(详解)
Oct 07 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
vue.js封装switch开关组件的操作
Oct 26 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基础教程 php内置函数实例教程
2012/08/21 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue根据值给予不同class的实例
2018/09/29 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
深入理解Python变量与常量
2016/06/02 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
python实现KNN分类算法
2019/10/16 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
优秀应届毕业生自荐书
2014/06/29 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
城南旧事观后感
2015/06/11 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
基于Python实现一个春节倒计时脚本
2022/01/22 Python