50-预解析

  • 什么是预解析?
    • 浏览器在执行 js 代码的时候会分成两部分操作: 预解析以及逐行执行代码
      也就是说, 浏览器不会直接执行代码, 而是加工处理之后再执行代码
    • 这个加工的过程我们就称之为预解析
  • 预解析规则
    • 将变量声明和函数声明提升到当前作用域最前面
    • 将剩余代码按照书写顺序依次放到后面
  • 注意点:
    • 通过 let 定义的变量不会被提升(不会被预解析)
        // 预解析之前
        console.log(num);   // undefined
        var num = 123;
        // 预解析之后
        var num;
        console.log(num);
        num = 123;

        // 不会被预解析
        console.log(num);   //报错
        let num = 456;
  • ES6之前定义函数的格式

          // 预解析之前的代码
          console.log(say);
          say();
          // ES6之前的这种定义函数的格式, 是会被预解析的, 所以可以提前调用
          function say() {
              console.log("hello it666");
          }
    
          // 预解析之后的代码
          function say() {
              console.log("hello it666");
          }
          console.log(say);
          say();
    
          // 预解析之前的代码
          console.log(say);    // undefined
          say();  // say is not a function
          // 如果将函数赋值给一个var定义的变量, 那么函数不会被预解析, 只有变量会被预解析
          var say = function () {
              console.log("hello it666");
          }
    
          // 预解析之后的代码
          var say;   
          console.log(say);    // undefined
          say();
          say = function () {
              console.log("hello it666");
          }
    
  • ES6定义函数的格式

          console.log(say);
          say();  // say is not defined
          // 如果将函数赋值给一个let定义的变量, 那么函数不会被预解析, 变量也不会被预解析
          let say = () => {
              console.log("hello it666");
          }
    

你可能感兴趣的:(50-预解析)