JavaScript 核心基础——(三)预解析

38 阅读1分钟

1. 概念

  • JS 是一种解释型语言,就是在代码执行之前,先对代码进行通读和解释,然后再执行代码
  • 也就是说,JS 代码在运行的时候会经历两个环节;解释代码执行代码
  • JavaScript 引擎在对 JavaScript 代码进行解释之前,会对代码进行预解析,在预解析阶段,会将以关键在 varfunction 开头的语句块提前进行处理
  • 处理过程:当变量和函数的声明语句处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头

2. 预解析的内容

  • var 关键字:预解析过程中会把 var 关键字声明的变量进行提前声明,但是不进行赋值

    console.log(num); // undefined
    var num = 100;
    console.log(num); // 100
    
  • 声明式函数:预解析过程中遇到声明式函数,会在内容中先声明有一个

    console.log('fn:', fn); // undefined
    fn(); // err: Uncaught TypeError: fn is not a function
    var fn = function() { console.log('fn 函数') }
    fn();
    

这里报错是因为预解析只是声明了一个 fn 变量,没有给它赋值函数

3. 预解析中的重名问题

  • 当使用 var 声明变量和声明式函数重名的时候,以函数为主

  • 这种重名的处理规则只限于在解析阶段

    num();
    var num = 100;
    num(); // err: num is not a function
    function num() { console.log('num function')};
    num();