javascript/js预编译的四部曲

众所周知javascript是解释性语言,主要特点为解释一行执行一行。

而在js运行时会进行三件事:1语法分析 2.预编译 3.解释执行

面我们来看一下真正的预编译:

预编译(精装版本):

预编译的四部曲:

    1.创建GO/AO对象
    2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
    3.将实参值和形参统一

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

javascript/js预编译的四部曲_第1张图片
再次函数中我们来进行预编译:
1.创建AO对象:我们隐式的在函数中创建了一个AO的对象来盛放函数中的变量,此时对象中并没有值;

   2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined:我们在第二个过程中需按照变量和形参
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190403211313807.png)
   3.将实参值和形参统一:此时将实参带入函数中由于在函数外 f(1),因此AO中a = 1
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190403211412144.png)
   4.在函数体里面找函数声明,值赋予函数体:由于在函数中有 function a() {} ,这一函数因此此时AO中 a = function a() {}
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190403211447845.png)
   在进行完预编译后此时若执行函数则会以AO为基础对函数中的变量进行赋值:此时函数中有两次打印一次在函数开头,一次在函数为a赋值之后

再赋值前由于AO中值不变因此a所打印出的值为 function a() {}

在赋值后AO中a = 123,所以此时打印出的值为123。

你可能感兴趣的:(javascript/js预编译的四部曲)