浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的JavaScriptt解析器”开始工作。

JavaScript解析器工作步骤:

1、“找一些东西”: var、 function、 参数;(也被称之为预解析)

备注:如果遇到重名分为以下两种情况:

遇到变量和函数重名了,只留下函数

遇到函数重名了,根据代码的上下文顺序,留下最后一个

2、逐行解读代码。

备注:表达式可以修改预解析的值

JS解析器在执行第一步预解析的时候,会从代码的开始搜索直到结尾,只去查找var、function和参数等内容。一般把第一步称之为“JavaScript的预解析”。而且,当找到这些内容时,所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;所有的函数,在正式运行代码之前,都是整个函数块。

<!DOCTYPE html>

<html>

<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”。

转载于:https://www.cnblogs.com/leoshuaige/p/7077638.html

浏览器是怎么解析JS的代码相关推荐

  1. 解决360等等浏览器兼容模式解析不兼容代码

    之前写的代码不是很规范 , 在今天测试下发现360浏览器等等的浏览器使用兼容模式会有很多不兼容 , 网上了解过一下 , 说是很多浏览器的兼容模式可能就是为了兼容IE7之前的网站代码 , 而非我们字面理 ...

  2. 对ie浏览器版本识别的js代码

    对ie浏览器版本识别的js代码 // 判断是pc端还是还是手机 var theUA = window.navigator.userAgent.toLowerCase(); // 识别ie的 var t ...

  3. 【行情采集】解析JS 1秒获取5000支股票瞬时行情(送代码,含筛选方法)

    提示:采集行情仅用于个人量化分析,不做为交易依据 解析JS 1秒获取5000支股票瞬时行情(送代码,含筛选方法) 前言 一.JS采集? 二.代码如下 总结 前言 量化分析,行情先行. 一.JS采集? ...

  4. vscode+node.js 调试js程序/edge浏览器调试javaScript/edge浏览器独立调试编辑并保存代码/浏览器内开发者工具element/console布局(focus Mode)

    文章目录 declaration vscode 对于javascript的支持 环境 使用node.js调试纯js代码 使用浏览器调试 试验代码 Note! edge浏览器独立调试编辑并保存代码 窗格 ...

  5. 【行情采集】解析JS 0.5秒获取版块(可分行业、概念、地域)今日、5日内、10日内资金流向(送代码)

    提示:采集行情仅用于个人量化分析,不做为交易依据 解析JS 0.5秒获取版块(可分行业.概念.地域)今日.5日内.10日内资金流向(送代码) 前言 一.为什么要观察资金流? 1.资金流定义 2.资金流 ...

  6. java解析js代码----笔记

    笔记直接贴代码了 package top.demo.js;import javax.script.Invocable; import javax.script.ScriptEngine; import ...

  7. js经典代码200句

    200多个js技巧代码 1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 Onselect:当文 ...

  8. 浏览器是先执行js还是先加载HTML,在HTML中使用JavaScript(浏览器对js的加载机制分析)...

    前言: 向HTML页面中插入JavaScrip的主要方法,就是使用 要点: 1.script标签用外链的src引入文件时,内嵌的js代码无效. 2.只要不存在defer和async属性,浏览器都会按照 ...

  9. python动态页面元素爬取_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  10. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

最新文章

  1. IMDB是否提供API? [关闭]
  2. ASP.NET MVC 4 (三) 过滤器
  3. python读文件的三个方法read()、readline()、readlines()详解
  4. 告别2013拥抱2014
  5. 经验总结 | PyCharm 详细使用指南!
  6. Qt使用QPainter绘图的缩放问题
  7. TensorFlow 深入MNIST
  8. 五种 JSP页面跳转方法详解
  9. pytorch之各类图像库的图片读写方式
  10. 数据库的几个基本概念
  11. 如果处理vim产生的swp文件 以及diff功能的使用
  12. 模板方法模式(模板方法设计模式)详解
  13. GPS卫星星历与历书
  14. Vlookup实现多条件匹配
  15. 网页HTML5制作flex布局骰子,css利用flex布局画骰子的六个面
  16. 海底捞月战法实战讲解
  17. 蓝牙 aptx android,蓝牙aptx干嘛用的
  18. 2014新浪校招笔试题:取水果
  19. 景安网络快云mysql版本_景安快云数据库使用教程
  20. SpringCloud实用篇02

热门文章

  1. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(上)
  2. 数据告诉你,抖音凭什么逆袭?
  3. 对网站的文件和资源进行优化、前端开发优化
  4. android 代码实现back键功能
  5. 《啊哈!算法》-----系列更新暂时停止
  6. 剑指Offer_62_二叉搜索树的第k个结点
  7. android中的Handler和Callback机制
  8. C语言的本质(2)——二进制、八进制、十六进制与十进制
  9. linux 下idea 启动tomcat报JMX 1099错误解决办法
  10. Android 使用传感器