javascript预编译

本文深入解析JavaScript的运行过程,包括语法分析、预编译及解释执行三个阶段。阐述了全局与函数预编译的区别,以及作用域链的形成原理,帮助理解变量提升和函数内部调用全局变量的机制。

js运行三部曲

1.语法分析

2.预编译

3.解释执行

imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象GO所有

一切声明的全局变量,全是window的属性

预编译发生在执行之前,且预编译执行的地方不会在执行

函数每次执行的时候,都会产生AO,并且每次调用完之后AO对象会销毁

函数预编译

1.创建AO对象

2.找形参和变量声明,将形参和变量作为AO属性名,值为undefined

3.形参值和实参值相统一

4.在函数体里面寻找函数声明,值赋予函数体

以上的预编译按顺序执行,后面的会覆盖前面的

全局预编译

1.创建GO对象

2.变量作为GO的属性名,值赋为undefined

3.寻找函数,值赋为函数体

    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{

    a:    undefined

   b:    undefined

}

3.将形参和实参值统一

AO

{

      a:    1

     b: undefined

}

4.在函数体里面寻找函数声明,值赋予函数体

AO

{
       a:    function a() {}

      b:     undefined

      d:     function d() {}

}

创建AO对象之后,执行函数

输出的东西都在AO对象里面

第一个输出: function a () {}

AO{

  a:    123            // var a = 123;

      b:     undefined

      d:     function d() {}

}

第二个输出: 123

第三个输出: 123

AO{

  a:    123

      b:      function   () {}      // var b = function() {}

      d:     function d() {}

}

第四个输出: function b() {}

全局的与此类似,只是建立的是GO对象

作用域链

函数的[[scope]]属性,只有系统可以调用的属性,

function a() {
     function b() {
     var b = 234;     
}
     var a = 123;
     b();
}
 var glob = 100;
a()

 a的scope chain :

B在a的基础上增加自己的AO并且在最上面构成他的作用域链,而每当执行的时候,从最上面开始找变量或函数,这也很好的解释了javascript中函数内部可以用全局变量,因为全局变量全部都在GO当中,所以不会出现报错的情况。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值