主页

预解析

JavaScript代码是由浏览器中的JavaScript解释器来执行的,JavaScript解释器在运行JavaScript代码的时候分为两步:预解析和代码执行
js引擎会把js里面所有的 var 还有 function 提升到当前作用域的最前面,然后按照代码书写的顺序自上而下执行
let 不会预解析

变量预解析(变量提升)

变量提升,就是把所有的变量声明提升到当前作用域最前面,不提升赋值操作

函数预解析(函数提升)

函数提升,就是把所有的函数声明提升到当前作用域的最前面,不调用函数

预解析

// var b = function() { } // 这种是函数表达式**不是函数声明**
// function c() { }       // 这种是函数声明



function fn(a, c) {
  console.log(a)         // function a() { }
  var a = 123
  console.log(a)         // 123
  console.log(c)         // function c() { }
  function a() { }
  if(false) {
    var d = 678
  }
  console.log(d)         // undefined
  console.log(b)         // undefined
  var b = function() { }
  console.log(b)         // function () { }
  function c() { }
  console.log(c)         // function c() { }
}
fn(1, 2)

/*
  预解析
  作用域(全局作用域和函数作用域)的创建阶段 预解析的阶段
  预编译的时候做了那些事情
    js 的变量对象,在函数作用域的创建阶段也叫做 AO 对象,访问不到供 js 引擎自己去访问的;AO 对象在函数作用域的创建阶段做了哪些事情
      1. 创建了 AO 对象
      2. 找形参和变量的声明
      3. 实参和形参相统一 
      4. 找函数声明,如果函数声明的名称和变量声明名称一样的话,会覆盖变量的声明

  上面代码的 AO 对象
  AO: {
    a: undefined 1 function a() { }
    c: undefined 2 function c() { }
    d: undefined 1
    b: undefined 1
  }

  js 解释执行 逐行执行输出
  function a() { }
  123
  function c() { }
  undefined
  undefined
  function () { }
  function c() { }
*/

JavaScript

版权属于:Joe
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
0

目录

来自 《JS-预解析》
评论

qiaofugui

博主很懒,啥都没有
188 文章数
14 评论量
3 分类数
191 页面数
已在风雨中度过 2年130天20小时20分