首页 > 执行这段代码,输出什么结果。

执行这段代码,输出什么结果。

function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();


我觉得题主估计是要问为什么a为undefined,而函数却输出值2了。
这里涉及变量对象,进入函数上下文时a和foo被放到变量对象中,相当于初始化。
规定中:
函数声明:按名称和对应值(函数对象function-object)的形式创建变量对象的属性;
变量声明:按名称和对应值(undefined)的形式创建变量对象的属性。
所以原函数相当于:

function test() { 
    var a = undefined; 
    function foo() { 
        return 2; 
    }
    
    console.log(a); 
    console.log(foo()); 
    
    a = 1; 
} 
test();

所以输出了undefined和2。
被顶成-2?帮忙顶回去吧,这题并不是没有意义的题,涉及变量对象和执行上下文,要是函数和变量同名,情况又变了,个人愚见,不喜勿喷,这里本来就是问问题的地方。。


undefine
2


输出

undefined
2

第一个简单,因为a根本没有定义,所以undefined
第二个,function会提前声明,所以在调用foo()的时候,foo已经声明好了,如果是foo()则是调用foo,输出结果2,如果是foo则输出function foo(){return 2;}


自己实验一下,F12打开,在控制台输入你上述代码,运行就看到结果了.


输出结果:

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();

是否好理解了?


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的预解析,了解一下

【热门文章】
【热门文章】