javascript 预编译

预编译时会默认有两种现象

1、函数声明整体提升

      无论还是写在什么位置,通过预编译,都会将函数放在所有逻辑的最前面

     <script type="text/javascript">

     test();//这里也可以执行test函数,因为默认是将下面function test(){}放在了最前方

     function test(){}

     </script>

2、变量 声明提升

     <script type="text/javascript">

     console.log(a);//这里也可以a,且输出内容为undefined,因为默认是将下面的var a放在了最前方

    var a = 123;//其实这里相当于声明变量并赋值,即var a ; a = 123;

     </script>

 

预编译前奏

一、imply global(暗示全局变量):即任何变量,如何变量未经声明就赋值,此变量就为全局对象所有。

  1. eg: a=123; //a为全局window所有
  2. eg: var a = b= 123; // 依照从右向左赋值的过程,b=123,即b为全局window所有,但是a并不是的
  3. function test() { var a = b =123;} str(); console.log(a);-->a is not defined; console.log(b)-->123

二、一切声明的全局变量,全是window的属性

  1. eg: var a =123; ===>window.a = 123;

window是全局的域;一切定义在全局的变量都归window所有

var a = 123;

console.log(a);====>console.log(window.a);

 

函数预编译

一、四部曲

  1. 创建AO对象(Activation Object 执行期上下文)
  2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
  3. 将实参值和形参统一
  4. 在函数体里面找函数声明,值赋予函数体
  5. 练习:
    1. function fn(a){
    2.   console.log(a);//--->
    3.   var a = 123;
    4.   console.log(a);//--->
    5.   function a(){}
    6.   console.log(a);//--->
    7.  var b = function (){};
    8.  console.log(b);//---> 
    9.  function d(){};
    10. }
    11. fn(1);
  6. 预编译时创建AO对象值变化过程

            1. AO{ }

            2. AO{ a : undefined, b : undefined}

            3. AO{ a : 1, b : undefined}       

            4. AO{ a : 1, b : undefined, d : }     

            5. AO{ a : function a(){}, b : undefined, d : function d(){} }     

     7) AO对象的作用就是作用域,然后回头再去查看代码的执行

  1. function fn(a){
  2.   console.log(a); //因为AO{ a : function a(){}, b : undefined, d :function d(){} },所以输出内容为function a(){}
  3.   var a = 123; // 由于变量声明提升,那么a已经在函数体最初的时候被声明过了,且得到的AO对象如上。那么剩余的就是a被重新赋值还未执行,所以AO{ a : 123, b : undefined, d :function d(){} }
  4.   console.log(a); / /所以输出内容为123
  5.   function a(){}; // 函数声明整体提升了,这里不再执行了
  6.   console.log(a); //因为AO{ a : 123, b : undefined, d :function d(){} },所以输出内容为123
  7.  var b = function (){};// b被重新赋值,所以AO{ a : 123, b : function b(){}, d :function d(){} }
  8.  console.log(b); // ,所以输出内容为function b(){}
  9.  function d(){};
  10. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值