js解析过程
js在运行时会依次进行三步工作。
- 语法解析(通篇检查,检查一些低级的语法错误)
- 预编译(也就是变量提升)
- 解释执行
var的预解释机制
首先看一段代码
var a = 3;
console.log(a);
假设代码只有这两行,那么他是怎么进行解析的呢?
首先创建全局对象GO(global object)
将变量的值以属性值挂载到对象上,但是此时值为undeifind(此动作发生在代码执行前一刻)
编译完成开始执行代码赋值
此时上边两行代码,正常顺序的话应该输出3,但是如果颠倒顺序,由于预编译,他的值为undefind。所以在赋值前输出,结果应为undefind。
function 预编译
其实函数的预编译和var相似,在函数执行前一刻进行编译
- 创建AO (Activstion Object)[执行期上下文] --AO{}对象
- 找形参和变量声明,将这二者作为属性名,值为underfind
- 将实参形参统一
- 找函数声明,值赋予函数体
还是通过代码来看看具体步骤吧
function fn(a) { 1.创建AO空对象 --AO{}
console.log(a);// funtion 2.找形参和变量声明,将这二者作为属性名,值为underfind
AO{
var a = 123; a:underfind,
console.log(a);123 b:underfind,
}
3.将实参形参统一
function a() {}; AO{
a:1,
b:underfind,}
console.log(a); 123 4.找函数声明,值赋予函数体
var b = function () {}; AO{
console.log(b); function a:function
b:underfind
function d() {}; d:function
} } 预编译完成,开始执行函数
fn
需要注意的是:任何变量如果未经声明就赋值,声明的变量也为全局所有。windows就是全局的域。