预编译的四部(在其中执行过的运行时不执行)
- 创建AO对象
- 找形参合和变量声明,将变量和形参名作为AO对象,值为undefined
- 将形参和实参统一
- 在函数体里面找函数声明,值赋予函数体(将函数名作为AO对象的属性名写进AO对象)
function fn(a){
console.log(a);//答案1
var a = 123;
console.log(a);//答案2
function a(){};//函数声明
console.log(a);//答案3
var b =function (){};//函数表达式
console.log(b);//答案4
function d(){}//函数声明
}
fn(1);
-
第一步
AO{}
-
第二部
AO{
a:undefined //变量声明+形参
b:undefined //变量声明
} -
第三部
AO{
a:1*//实参传值*
b:undefined;
} -
第四步
AO{
a:function a(){};
b:function b(){};
d:function d(){}
}
所以答案:
答案1:function a(){}
答案2:123
答案3:123
答案4:function (){}
例二(有全局变量)
function test(){
console.log(b);//答案1
if(a){
var b = 100;
}
console.log(b);//答案2
c = 234;
console.log(c);//答案3
}
var a;
test();
a=10;
console.log(c);//答案4
1.GO{
a:undefined;
}
AO{
b:undefined;
}
2.运行
GO{
a:undefined;
c:234;
}
AO{
b:undefined;
}
所以答案:
答案1:undefined
答案2:undefined
答案3:234
答案4:234
例三
function bar()
{
return foo;
foo = 11;
function foo(){}
var off = 11;
}
console.log( bar()) ;
答案:function foo(){};
例四
a = 100;
function demo(e){
function e(){}
arguments[0]= 2;
console.log(e);//2
if(a){
var b = 123;
function c(){}
}
var c;
a = 10;
var a;
console.log(b);//undefined
f = 123;
console.log(c);//undefined
console.log(a);10
}
var a;
demo(1);
console.log(a);100
console.log(f);123
来源:CSDN
作者:柒777
链接:https://blog.csdn.net/weixin_44463600/article/details/104116139