JavaScript预编译原理分析

一直对变量对象,活动对象,预编译,变量提升,执行上下文的时间顺序有着凌乱的认识,但是这些对理解JS语法有着很重要的作用。读了很多人的文章,都没有一个特别清晰的把这些写出来。

今天主要总结一下现阶段自己的认识。

JS是解释型语言,底层是C写的,写完代码后需要解释器解析成c,再转成二进制文件才能执行。

所以一个JS代码块,先全局的词法分析(变量声明(提升)、函数声明,创建全局变量)语法分析(构建语法树,查看有没有语法错误),静态作用域

全局上下文推入执行栈(全局变量对象window,全局作用域Global,确定this指向,this==window),执行代码(变量赋值,函数引用)。

遇到函数。执行函数前,将函数执行上下文推入执行栈,创建函数执行上下文(创建变量对象(注意),建立作用域链,确定this指向)

注意:变量对象创建分为:参数对象创建,即arguments对象

函数声明:检查当前上下文的函数声明,也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。
function声明会比var声明优先级更高一点。

变量声明:检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined(提升)。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。

执行代码:变量对象变活动对象,变量赋值,函数引用。