function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
理清楚就简单了,首先console.log(a)
var a解析为undefined
,所以输出undefined
console.log(foo())
输出函数的返回值无疑问,是js的预解析,了解一下
输出结果:
undefined
2
But why? 因为JavaScript
有个Just In Time Compilation
,所以实际上代码运行时并非完全你看到的这个样子,它会被"预编译"成以下样子:
function test() {
function foo() {
return 2;
}
var a;
console.log(a);
console.log(foo());
a = 1;
}
test();
是否好理解了?
输出
undefined
2
第一个简单,因为a根本没有定义,所以undefined
第二个,function会提前声明,所以在调用foo()的时候,foo已经声明好了,如果是foo()则是调用foo,输出结果2,如果是foo则输出function foo(){return 2;}
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
我觉得题主估计是要问为什么a为undefined,而函数却输出值2了。
这里涉及变量对象,进入函数上下文时a和foo被放到变量对象中,相当于初始化。
规定中:
函数声明:按名称和对应值(函数对象function-object)的形式创建变量对象的属性;
变量声明:按名称和对应值(undefined)的形式创建变量对象的属性。
所以原函数相当于:
所以输出了undefined和2。
被顶成-2?帮忙顶回去吧,这题并不是没有意义的题,涉及变量对象和执行上下文,要是函数和变量同名,情况又变了,个人愚见,不喜勿喷,这里本来就是问问题的地方。。