JS预编译
js运行三部曲
- 语法分析
- 预编译
- 解释执行
** 预编译 **
- 预编译发生在函数执行前的一刻。
- 简单现象:函数声明整体提升, 变量 声明提升(定义赋值不提升)
** 预编译过程(四部曲):**
1.创建AO对象(Activated Object)(执行期上下文)
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。
3.将实参值和形参统一。
4.在函数体里面找函数声明,值赋予函数体。
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); //解析 一、预编译过程: 1.创建AO对象,找形参和变量声明,将变量和形参名作为AO属性名,值设置为undefined。 AO{ a:undefined, b:undefined, } 2.形参和实参统一 AO{ a:1, b:undefined, } 3.找函数声明,值赋予函数体 AO{ a:function a(){}, b:undefined, d:function d(){}; } 二、执行过程 1.第一个console.log(a):function a(){}, 2.赋值a = 123; 3.第二和第三个console.log(a):123, 4.声明并赋值b后 AO{ a:123, b:function (){}, d:function d(){}; } console.log(b):function (){} //对于全局对象也是与上面函数预编译过程差不多 对于全局创建的是GO对象(global object)
** PS: **
1) imply global:没有声明就直接赋值的变量属于全局对象所有。
a = 12; //window.a = 12
2) 一切声明的全局变量全是window的属性。
window就是全局的域。
来源:https://www.cnblogs.com/chenyingjie1207/p/9955014.html