JS-----预编译

一.JS预编译

(1)预编译,简单理解,就是在内存中开辟一块空间,用来存放变量和函数。
(2)预编译发生在函数执行前;也就是说函数执行时,预编译已经结束。

2.要了解预编译,就要先了解变量声明。变量声明又分为全局和局部。

  • 任何变量,如果未经声明就赋值,此变量就为全局变量所有。
  • 一切声明的全局变量,都是window的属性。
    eg:
 <script>
    var a=123;
    console.log(window.a);//输出123
      b=3;
      console.log(window.b);
    </script>

这行代码可以诠释上面对全局变量的说明

在全局声明的变量,称为全局变量。全局变量的作用域就是全局。局部变量的作用域通常是在函数内部。全局作用域称为GO,全称:Global Object。临时作用域成为AO,全称:Activation Object。而GO又可以理解为window这个对象。GO和AO要和JS的预编译一起理解。

3.变量(声明提前)

解释:JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。
eg:

  <script>
   console.log("前"+a);//1     输出undefined
   var a=2;             //2
   console.log("后"+a);//3   输出2
    </script>

注意:(1)JavaScript 脚本在执行之前先进行预编译
上面的代码是这样运行的:执行前会把2代码的声明(即把var a)提前到顶部,后面的赋值(=2)留在原地不动,所以第1行代码执行的时候,a并没有赋值,所以输出的是undefined,当第3行代码执行时,var a 已经在第二行的时候进行了赋值,所以输出的是2.

4.函数声明(整体提前)

函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部。
eg:

 <script>
  test();
  function test(){
      console.log("提升了");//输出  提升了
  }
    </script>

如上代码:在函数的上面调用函数并没有报错,而是打印了,这就可以说明函数是整体提前了(即其实函数声明 function test() {} 已经提升到 test() 之前,这也是预编译导致的,所以函数 test() 能够在定义之前执行,并且没有报错。)

总结:
1()理解预编译需要明白 :先 变量/函数声明 和 后 变量赋值。
(2)预编译阶段,只进行 变量/函数声明,不会进行变量的初始化(即变量赋值,所有变量的值都是 undefined);变量赋值 是在解释执行阶段才进行的

二.函数的生命周期

函数的生命周期分为三个部分分别是:
eg:

   <script>
 var a=10;
 function fun(){
     var a=100;
     a++;
     console.log(a);//101
 }
 fun();//101
 console.log(a);//10
1. 开始执行前 (1)创建环境栈(数组 ECS) (2)向执行环境栈中压入第一个默认函数main(),创建全局作用域对象Window(GO) (3)全局做预编译 函数有个隐藏属性scopen记录着执行期上下文集合包括自己所属的作用域的对象 eg:

在这里插入图片描述

  1. 执行期
    (1)在ECS中压入一个新元素(函数执行环境)创建一个活动对象(AO),保存本次函数中的局部变量,AO对象中的parent指向父级作用域对象
    (2)执行过程中:优先使用活动对象中的局部变量
    eg:
    在这里插入图片描述
  2. 执行结束后
    (1)执行环境栈中的本次函数的执行环境出栈,因此活动对象被释放,同时局部变量一同释放
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值