js预编译输出题-解题思路

58 阅读1分钟
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)

做这种题可以按这个步骤画出来

编译阶段:

编译时候需要做了哪些事情

  • 1,创建ao对象
  • 2, 找形参和变量的声明,作为ao对象的属性名,值为undefined
  • 3, 实参和形参相统一,就是看是否有传进来参数
  • 找到函数声明,会覆盖变量的声明

编译结束后开始解释逐行执行阶段,从上往下一行行开始

那以上面的步骤套用一下下面的题试试

第一步和第二步一起做

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
}
开始代码一行行的执行
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)