JS 预编译
- 第一步: 语法分析
- 第二步: 预编译
- 第三步: 解释执行
1. 语义分析
语义分析是通篇执行的一个过程。不如有一篇代码,在执行时是解析一行执行一行,但在执行之前系统执行的第一步它会扫描一遍,看看有没有低级的语法错误,比如少些个符号,带个特殊字符之类的。此时通扫一遍,但是不执行,这个通篇扫面的过程叫语义分析,通篇扫面后就会预编译,然后解释一行执行一行,也就是解释执行。
2. 预编译
1. imply global
:暗示全局变量:即任何变量,如果变量未经声名就赋值,自变量就为全局对象所有
a = 10; // 这种应该就是 imply global 了 console.log(a); // 打印 10 window.a; // 10 说明 window 属性上有 a var b = 20; // 声名了 b, 此时 window 也有了 b
2. 一切声名的全局变量,全是 window
的属性
3. 函数声名提升:如果写了一个函数声名,无论写在哪里,浏览器都会把这个函数提到逻辑的最前面。函数声名整体提升
4. 变量 声名提升 所以系统只提升变量,而不是变量带着值一起提
var a = 123; // 上面的变量声名分为两步 var a; // 第一步,声名变量 a = 123; // 第二步, 变量赋值 console.log(a); // 打印出 undefined var a = 123;
2. 正式编译
-
-
创建
AO
对象 -
找形参和变量声名,将比那辆和形参作为
AO
属性名,值为undefined
。 -
将实参值和形参统一
-
在函数体里面找函数声名,值赋予函数体
-
例子代码
function fn (a){ console.log(a); var a = 123; console.log(a); function a (){} console.log(a); var b = function (){} console.log(b); } fn(1);
<!-- 输入顺序:
function a(){}
123
123
function (){}
-->
调用 fn
函数 -> 创建 AO
对象 -> 得到形参和变量名并给两者赋值 undefined
-> 找到实参,给形参赋值 -> 在函数体里寻找函数声名并赋值(此处 b
仍为 undefined
的原因是 var b = function() {}
这是一个函数表达式,非函数体)-> 得到预编译结果 -> 执行代码