实例分析浏览器中“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 相关文章推荐
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
JavaScript学习历程和心得小结
Aug 16 Javascript
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
Ajax验证用户名或昵称是否已被注册
Apr 05 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
js实现的格式化数字和金额功能简单示例
Jul 30 Javascript
vue filter 完美时间日期格式的代码
Aug 14 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
Nov 06 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+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
PHP实现递归的三种方法
2020/07/04 PHP
jquery实现metro效果示例代码
2013/09/06 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
js实现随机8位验证码
2020/07/24 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
KMP算法精解及其Python版的代码示例
2016/06/01 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
python的mysqldb安装步骤详解
2017/08/14 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
法制宣传月活动总结
2014/04/29 职场文书
运动会标语
2014/06/21 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书