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)