JINXB'S BLOG


语法分析:js引擎在解析js代码之前,会通篇扫描一下,找出低级的语法错误(写错大括号之类的)。
编译执行:js是一种解释性语言,编译一行执行一行,当语法分析没有问题,并且已经完成预编译之后,便开始解释执行代码。

Js知识点小结(预编译)

js运行三部曲

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

预编译前奏

1.imply global 暗示全局变量。

如果任何变量未经声明就赋值使用,此变量就会为全局对象window所有,并且成为window对象的一个属性。

1. window.a = 123;
2. window.a === a // true;

或者

1. a = 123;
2. window.a === a //true

2.一切声明的全局变量,都是window的属性。

1. var a =123;
2. console.log(window.a); //123
  • 区别:经过声明的全局变量不能通过delete操作来删除,但是未经声明的全局变量可以被删除。
1. a = 123;
2. console.log(wondow.a === a) //true
3. delete window.a;
4. console.log(window.a); //undefiend
5. var b = 123;
6. delete window.b;
7. console.log(window.b); //123

预编译的过程总结为以下四步

1.创建AO对象。

2.寻找形参和变量声明,将变量和形参作为AO对象的属性名添加到对象中,值为undefined。值得注意的是,函数声明不叫变量。

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

4.在函数体里面寻找函数声明,将函数名作为属性名,值为这个函数的函数体。 函数在执行的前一刻会产生一个上下文,这个上下文就是Activeaction Object对象,简称AO对象。 AO = {}

这个对象是空的,但是里面有一些我们看不到的却存在的隐式属性,比如this:window属性和arguments:[]属性
这个对象用来存放一些属性和方法,这些属性和方法就按照前面的四步来产生。

1. function test (a,b){
2.    consolel.log a
3.    function a(){}
4.    a = 222;
5.    console.log a
6.    function b(){};
7.    console.log b
8.    var b = 111;
9.    var a;
10.  }
11.  test(1)

这里用上面这个样例代码来简单的介绍一下预编译过程。
1.创建一个AO对象。
var AO = {} ;
2.寻找形参值和变量声明,并且将其赋值为undefined。

AO = {
    a : undefined,
    b : undefined
}

3.将实参值和形参值相统一。这里属性名已存在,直接赋值。

AO = {
    a : 1,
    b : undefined
}

4.寻找函数声明,将函数体赋值给属性。

AO = {
    a : function (){},
    b : function (){}
}

第一个console.log a –> function () {}
第二个console.log a –> 222 因为执行了a = 222这一行代码,所以重新赋值了。
第三个console.log b –> function () {}
• var b = function () {}这种不叫做函数声明,这个函数是赋值给b变量的,b变量是声明。

function fn(a){
    a //function
    d //function
    var a = 123;
    a //123
    function a(){}
    b //undefined
    var b = function (){}
    b //function
    function d(){}
}

这里的var b = function () {}只是声明了b变量,在第四步寻找函数声明里面并不会把b赋值成function () {},因为后面的函数并不是声明,当代码开始解释执行之后,执行到这一行之后才把b赋值成这个函数。

• 寻找变量声明的时候,不会管里面的代码到底会不会执行,执行是后面的事,这里只负责寻找所有变量。

function test(b){
    a //undefined
    if(1>5){
        var a = 123;
        function b(){}
    }
    a //undefined
    b //undefined
    var b = 234;
    b //234
}
test(2);

打印第一个a的时候并不会报错而是undefined,当a没有声明的时候才会报错,因此这里a是有声明的,只是没有赋值而已,它根本不看有没有if,if的条件是不是真对寻找变量声明都没有关系。
第二步寻找形参和变量声明时候的AO对象:

AO = {
    a: undefined //这里a虽然在if里面 但是也被声明了
    b: undefined
}

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

Copyright 2019-2020 JINXB'S BLOG 鄂ICP备20002230号-1