JS预编译

本文详细介绍了JavaScript中的预编译过程,包括函数预编译和全局变量预编译。通过实例解析了函数执行的步骤,如形参赋值、变量声明和函数体的挂载。同时,讨论了全局变量如何挂载到全局对象(GO)并在执行时生成激活对象(AO)。最后,展示了全局变量和局部变量在预编译和执行阶段的值变化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 通篇检查语法错误
  2. 预编译
  3. 开始解释一行,执行一行

函数的预编译

 function test(a) {
   console.log(a);
   var a = 1;
   console.log(a);
   function a() {}
   console.log(a)
   var b = function(){}
   console.log(b);
   function d() {}
 }
 test(2);

打印结果
在这里插入图片描述

函数执行步骤

在函数执行前的一瞬间会生成自己的AO,(Activation Object,活跃对象也叫函数上下文,如果函数执行2次,生成了两次AO,这两次的AO是没有任何关联),变量都会挂载到AO中,具体步骤如下

  1. 寻找形参和变量声明
  2. 实参值赋值给形参
  3. 寻找函数声明并赋值函数体
  4. 从函数体第一行开始逐行执行

结合本例讲解

  1. 寻找形参和变量声明
AO={
  a:undefined,// 形参
  b:undefined,// 变量声明
}
  1. 实参值赋值给形参
AO={
  a:undefined -> 2,// 实参值2赋值给形参a
  b:undefined,
}
  1. 寻找函数声明并赋值函数体
AO={
  a:undefined -> 2 -> function a() {},// 寻找函数声明并赋值函数体
  b:undefined,
  d:function d() {} //寻找函数声明并赋值函数体
}
  1. 从函数体第一行开始逐行执行
 function test(a) {
   console.log(a); // function a() {}
   var a = 1; // 将1赋值给a,a:undefined -> 2 -> function a() {} -> 1
   console.log(a); // 1
   function a() {} // 第3步已预编译,执行时此行无影响
   console.log(a) // 1
   var b = function(){} // 将function(){}赋值给b,即b:undefined -> function(){}
   console.log(b); // function(){}
   function d() {} // 第3步已预编译,执行时此行无影响
 }

从预编译到执行结束,值的全部变化过程:

AO={
  a:undefined -> 2 -> function a() {} -> 1,
  b:undefined -> function(){},
  d:function d() {} 
}

加上全局变量的预编译

  var b = 3;
  console.log(a);

  function a(a) {
    console.log(a);
    var a = 2;
    console.log(a);
    function a() {}
    var b = 5;
    console.log(b)
  }
  a(1);

预编译时,全局变量挂载到GO(Global Object,即全局对象)上

  1. 寻找变量
  2. 寻找函数声明
  3. 执行

结合本例讲解

1. 寻找变量

  GO = {
    b:undefined
  };

2. 寻找函数声明

  GO = {
    b:undefineda: function a(a) {
	    console.log(a);
	    var a = 2;
	    console.log(a);
	    function a() {}
	    var b = 5;
	    console.log(b)
	  }
  };

3. 执行
当执行到a(1);时,开始生成AO

  GO = {
    b:undefined,->3
    a: function a(a) {
	    console.log(a);
	    var a = 2;
	    console.log(a);
	    function a() {}
	    var b = 5;
	    console.log(b)
	  }
  };
  AO = {
    a:undefined,->1->function a() {},
    b:undefined
  }

结束预编译

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值