基本原理
一、引擎很复杂,但是基本原理很简单。
1、引擎(如果是浏览器,则引擎被嵌入在其中)读取(“解析”)脚本。
2、然后,引擎将脚本转化(“编译”)为机器语言。
3、然后,机器代码快速地执行。
二、引擎会对流程中的每个阶段都进行优化。它甚至可以在编译的脚本运行时监视它,分析流经该脚本的数据,并根据获得的信息进一步优化机器代码。
js解析执行过程
一、从整体上,js解析执行过程分为两个步骤
- 解释
- 执行
其中,编译是在解释器中进行,将代码编译成可执行码。运行是在JavaScript引擎中进行,执行可执行码。
编译过程
执行过程
一、运行过程由两个过程组成:
- 预解析
-
预解析
一、预解析的工作是
收集变量
-
变量收集
一、变量收集,又名为变量提升。收集的变量有以下三种:
var 声明的变量,初始值为undefined
- arguments参数,值为传入的实参
- function声明定义
二、若格式变量名有重复的话,按照优先级来确定:function声明定义 > 函数参数 > var 声明的变量
三、注意:
- let和const声明的变量不会在预解析阶段变量提升,只有在执行阶段执行到该行才会声明该变量。
- 当我们给一个未声明的变量赋值时,JavaScript引擎会认为我们是要声明一个全局变量。但如果我们访问一个未声明的全局变量,会报错。
- var a = function() {},变量提升时,a是值为undefined的变量而不是函数定义
分号补全
一、JS执行是需要分号的,但为什么以下语句却可以正常运行呢?
二、自动加分号的规则console.log('a')
console.log('b')
- 当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
- 当有},如果缺少分号,会补分号
- 程序源代码结束时,如果缺少分号,会补分号。
1、若是出现以下情况,必须得加上分号。否则会出现报错。
- 如果一条语句以
(
{
/
+
-
开始,当前一条语句没有用;
结尾的话,就会与前一条语句合在一起解释