预编译 - js函数高级

JS运行机制

  • 语法分析

  • 预编译

  • 解释执行

预编译

  • 函数声明整体提升

  • 变量声明变量名提升

预编译前奏

  • 如果变量未声明就赋值,此变量为全局对象所有

var a = b = 123 //在局部作用域中声明

此时b为全局变量

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

预编译开始

  • 创建AO对象

  • 形参变量声明,将形参名变量作为AO属性名,值为undefined

  • 将实参值和形参统一

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

function fn(a) {
  console.log(a)

  var a = 123
  console.log(a)

  function a() {}
  console.log(a)

  var b = function() {}
  console.log(b)

  function d() {}
}
fn(1)
  1. 创建AO对象(Activation Object)[执行期上下文]

AO {}

  1. 处理AO对象,设置AO的key
AO {
  a: undefined,
  b: undefined
}
  1. 参数统一
AO {
  a: 1,
  b: undefined
}
  1. 函数声明处理
AO {
  a: function a() {},
  b: undefined,
  d: function d() {},
}

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

  1. 执行函数
  • 处理赋值,将变量值赋值给相关的变量名
打印输出:

function a() {}

123

123

function () {}

Go (Global Object) 就是window,同时GO的预编译和AO一样

posted @ 2021-07-29 19:19  独舟者  阅读(41)  评论(0)    收藏  举报