Javascript的预编译

74

基础很关键,抓紧时间重新复习一下

Javascript是解释型语言,运行过程如下:

  • 语法分析(检查js是否存在语法错误)
  • 预编译(js代码执行之前,在内存中开辟空间,创建js的变量对象,存放变量与行数)
  • 解析执行(执行js)

预编译做了哪些事情:

1.创建AO对象

隐式创建的js变量对象,AO(Activation Object)对象,供js引擎自己去访问的

AO:{
  a:undefined
  c:undefined
}

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

注意此处是变量声明(必须带var),只是查找形参名和变量声明名不赋值。

3.实参和形参相统一

即修改AO对象中属性名为形参的值为传入的实参,如果没有形参此步略过。

4.查找函数声明,函数名作为AO对象的属性,函数体作为的值

此处是函数声明,而非匿名函数和函数表达式。函数申明会覆盖变量的申明

结论: 预编译过程就是查找变量声明、形参和函数声明的过程,并不初始化赋值,在解释执行阶段才会进行初始化 。

举例:

function fn (a, c) {
  console.log(a)  // function a () { }
  var a = 123
  console.log(a)  // 123
  console.log(c)  // function c () { }

  function a () { }
  if (false) {
    var d = 780
  }

  console.log(d)  // undefined
  console.log(b)  // undefined
  var b = function () { }
  console.log(b)  // function () { }
  function c () { }
  console.log(c)  // function c () { }
}

fn(1, 2)



->> 查找变量和形参 ->

AO:{
  a: undefined 1
  c: undefined 2
  d: undefined
  b: undefined
}

结果:

image.png