JS预编译

白昼怎懂夜的黑 提交于 2020-02-10 23:10:19

JS预编译

js运行三部曲

  1. 语法分析
  2. 预编译
  3. 解释执行

** 预编译 **

  1. 预编译发生在函数执行前的一刻。
  2. 简单现象:函数声明整体提升, 变量 声明提升(定义赋值不提升)

** 预编译过程(四部曲):**
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就是全局的域。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!