# 2.Js编译过程

# 语法分析

计算机先通篇浏览代码,检查是否有错误

# 预编译

函数声明整体提升(计算机会提前阅读function) 变量 声明提升(计算机会提前阅读变量的声明)

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

a = 10; ===> window.a = 10;

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

  • window就是全局

window就是JS里最大的仓库,任何变量和函数都会存放在这里面 如果直接 var a = 10; 再 console.log(a); 其实等于console.log(window.a); 如果是 function test() { var b = 123; } test(); 则相当于在把b放在window这个大仓库里的一个叫做test的function箱子里,此时的b属于function,而不为window所有

# 函数预编译

预编译的过程发生在函数执行的前一刻

  1. 创建AO对象 Activation Object(执行期上下文,是一个域)

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

  3. 将实参值和形参统一

  4. 在函数体里面找函数声明,函数名作为AO属性名,其值是它本身的函数体

# 全局预编译

  1. 创建GO对象 Global Object (GO就是window )

  2. 找变量声明,将变量名作为GO属性名,值为undefined

  3. 在函数体里面找函数声明,函数名作为GO属性名,其值是它本身的函数体

# 解释执行

运行代码,解释一行执行一行(JS特点:解释性语言、单线程)