JavaScript是解释型语言,
既然是解释型语言,就是编译一行,执行一行
传统的编译会经历很多步骤,分词、解析、代码生成什么的
javaScript运行三部曲
- 语法分析
- 预编译
- 解释执行(就是执行代码)
预编译是什么?
预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数
预编译四步
我们来看下这个代码
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a(){ }
console.log(a);
var b = function(){ }//注意这不是个函数体
console.log(b);
function d(){ }
}
fn(1);
- 首先在函数执行前创建一个OA对象
OA{
}
- 找到函数形参和变量声明,将函数和形参名的作为Ao对象的属性名,值为undefined
OA{
a:undefined
b:undefined
}
- 实参形参相统一
OA{
a:1
b:undefined
}
- 找到函数中的函数定义,函数名为AO对象属性名,值为函数体
OA{
a:function a(){ }
b:undefined
d:function d(){ }
}
最后一步一步的执行代码
function fn(a) {
console.log(a);//代码第一句,所以输出function a(){ }
var a = 123;//后OA对象里面为
OA{
a:123
b:undefined
d:function d(){ }
}
console.log(a);//输出所以是123
function a(){ }
console.log(a); //这里输出也是123
var b = function(){ }//执行到这里的时候OA里面发生了变化
OA{
a:123
b:function(){ }
d:function d(){ }
}
console.log(b);// var b不执行 改变AO对象中的属性b为function(){}
function d(){ }
}
fn(1);