js 预编译总结

230 阅读1分钟

形参、实参

定义:形参就是函数声明时的变量 定义:实参就是调用该函数时传入的具体参数

function add(a,b){
   return a + b
}
add(1,2)

/*
* a,b 就是形参
*调用函数add(1,2),1、2就是实参
*/

函数作用域的预编译

解题步骤:

  • 创建AO对象 AO{}执行上下文
  • 找变量声明和形参, 将变量名、形参名当作AO对象的属性名,值为undefined
  • 将实参值和形参相统一
  • 在函数体里面找函数声明 值赋予函数体
function fn(a,c){
   console.log(a)  // function (){}
   var a = 111
   console.log(a)  // 111
   console.log(c)  // function(){}
   function a (){}  // 函数声明
   if(false){
     var d = 222
   }
   console.log(d)  // undefined
   console.log(b)  // undefined
   var b = function (){}  // 函数表达式
   console.log(b)   // function (){}
   function c (){}
   console.log(c)  // function (){}
}
fn(1,3)
  • 预编译第一步:创建AO对象
AO{
}
  • 预编译第2步:找形参和变量声明,将形参名和变量名作为AO对象的属性名
AO {
 a:undefined
 c:undefined
 b:undefined
 d:undefined
}
  • 预编译第3步:将实参值和形参相统一
AO {
 a:undefined 1 
 c:undefined 3
 b:undefined
 d:undefined
}
  • 预编译第4步:在函数体里面找函数声明(不是函数表达式),值赋予函数体
AO {
 a:undefined 1  function a (){}
 c:undefined 3  function c (){}
 b:undefined
 d:undefined
}

全局预编译

解题思路

  • 创建GO对象
  • 找变量声明,将变量名作为GO对象的属性名,值为undefined
  • 找函数声明,值赋予函数体
console.log(test)
console.log(a)
function test(a){
  console.log(c) 
  var a = b = 345
  c = 9
  if(false){
     var c = 789
  }
  console.log(a)
  console.log(c)
}
test(234)
console.log(b)
console.log(test)
var test = 123
var b = 456

解析

GO {
   test:undefined function test(){}
   a:undefined
   c:undefined
   b:undefined
}