关于JS预编译小结

关于JS预编译过程理解。

看一到常见面试题,请问下面输出的值是多少?
        function fn(a, c) {
            console.log(a) 
            var a = 123 
            console.log(a)
            console.log(c) 
            function a() { }
            if (false) {
                var d = 678
            }
            console.log(d) 
            console.log(b) 
            var b = function () { }
            console.log(b) 
            function c() { }
            console.log(c) 
        }
        fn(1,2)

正确答案:

        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在预编译阶段都做了些啥,你就能理解为啥是这些输出了!
1. js会创建ao对象(供js引擎自己去访问的)
2. 找到形参和变量的申明并且会赋值undefined
3. 实参和形参相统一
4. 找函数声明 会覆盖变量的声明

接下来我们看一下这个函数作用域生成的ao对象的过程

//js创建ao对象
ao {

}
//找到形参和变量的申明
ao {
  a :undefined
  c : undefined
  d : undefined
  b : undefined
}
//实参和形参相统一
ao {
  a :1
  c :   2
  d : undefined
  b : undefined
}
//找函数声明 会覆盖变量的声明
ao {
  a :function a() { }
  c :   function c() { }
  d : undefined
  b : undefined
}

到此为止预编译阶段结束,之后js会逐行解释执行。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JS运行分三个步骤: 语法分析 预编译 解释执行 通常js在执行代码前,系统会先执行语法分析,通篇扫描一遍看是否有...
    深度剖析JavaScript阅读 1,586评论 0 6
  • JavaScript预编译 大家都知道JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行,...
    small_Axe阅读 1,644评论 0 1
  • 函数的执行顺序1.语法分析(扫描一遍,看有没有语法错误之类的)2.预编译3.解释执行(解释一行,执行一行) 预编译...
    随风飞2019阅读 2,454评论 0 0
  • JS是解释型语言,就是编译一行,执行一行 JS运行三部曲 1 语法分析2 预编译3 解释执行语法分析很简单,就是殷...
    我的天气很好啦阅读 1,274评论 0 0
  • JS的运行分三部:语法分析 ➡️预编译➡️解释执行 语法分析:JS引擎先通篇扫描一遍,查看是否有低级语法错误 (函...
    何时葡萄先熟透阅读 2,312评论 0 0