JS 预编译

  • 第一步: 语法分析
  • 第二步: 预编译
  • 第三步: 解释执行

  1. 语义分析

 

    语义分析是通篇执行的一个过程。不如有一篇代码,在执行时是解析一行执行一行,但在执行之前系统执行的第一步它会扫描一遍,看看有没有低级的语法错误,比如少些个符号,带个特殊字符之类的。此时通扫一遍,但是不执行,这个通篇扫面的过程叫语义分析,通篇扫面后就会预编译,然后解释一行执行一行,也就是解释执行。

  2.  预编译

    1.  imply global:暗示全局变量:即任何变量,如果变量未经声名就赋值,自变量就为全局对象所有

a = 10; // 这种应该就是 imply global 了
console.log(a); // 打印 10
window.a; // 10 说明 window 属性上有 a
var b = 20; // 声名了 b, 此时 window 也有了 b

    2. 一切声名的全局变量,全是 window 的属性

    3.  函数声名提升:如果写了一个函数声名,无论写在哪里,浏览器都会把这个函数提到逻辑的最前面。函数声名整体提升

    4. 变量 声名提升 所以系统只提升变量,而不是变量带着值一起提

var a = 123;    // 上面的变量声名分为两步
      
var a;   //  第一步,声名变量
      
a = 123;   //   第二步, 变量赋值
      

console.log(a);  // 打印出 undefined
var a = 123;

  2. 正式编译

    • 创建 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);

}
 fn(1);

<!-- 输入顺序:
  function a(){}
  123
  123
  function (){}
-->

  

调用 fn 函数 -> 创建 AO 对象 -> 得到形参和变量名并给两者赋值 undefined -> 找到实参,给形参赋值 -> 在函数体里寻找函数声名并赋值(此处 b 仍为 undefined 的原因是 var b = function() {} 这是一个函数表达式,非函数体)-> 得到预编译结果 -> 执行代码

    

转载于:https://www.cnblogs.com/pingzi-wq/p/11135959.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值