实例分析浏览器中“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在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
某人初学javascript的时候写的学习笔记
Dec 30 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
Angularjs 基础入门
Dec 26 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
Apr 12 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 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注入实例
2006/10/09 PHP
谈谈PHP的输入输出流
2007/02/14 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
对pandas中to_dict的用法详解
2018/06/05 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
Python下简易的单例模式详解
2019/04/08 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Pytorch释放显存占用方式
2020/01/13 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
主持人演讲稿范文
2013/12/28 职场文书
文化宣传方案
2014/03/13 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
小学中等生评语
2014/12/29 职场文书
领导干部考核评语
2015/01/04 职场文书
python中redis包操作数据库的教程
2022/04/19 Python