扫码关注官方订阅号
function test() { console.log(a); console.log(foo()); var a = 1; function foo() { return 2; } } test();
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
我觉得题主估计是要问为什么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?帮忙顶回去吧,这题并不是没有意义的题,涉及变量对象和执行上下文,要是函数和变量同名,情况又变了,个人愚见,不喜勿喷,这里本来就是问问题的地方。。
undefine2
理清楚就简单了,首先console.log(a)var a解析为undefined,所以输出undefined
console.log(a)
undefined
console.log(foo())输出函数的返回值无疑问,是js的预解析,了解一下
console.log(foo())
输出结果:
undefined 2
But why? 因为JavaScript有个Just In Time Compilation,所以实际上代码运行时并非完全你看到的这个样子,它会被"预编译"成以下样子:
JavaScript
Just In Time Compilation
function test() { function foo() { return 2; } var a; console.log(a); console.log(foo()); a = 1; } test();
是否好理解了?
自己实验一下,F12打开,在控制台输入你上述代码,运行就看到结果了.
输出
第一个简单,因为a根本没有定义,所以undefined第二个,function会提前声明,所以在调用foo()的时候,foo已经声明好了,如果是foo()则是调用foo,输出结果2,如果是foo则输出function foo(){return 2;}
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我觉得题主估计是要问为什么a为undefined,而函数却输出值2了。
这里涉及变量对象,进入函数上下文时a和foo被放到变量对象中,相当于初始化。
规定中:
函数声明:按名称和对应值(函数对象function-object)的形式创建变量对象的属性;
变量声明:按名称和对应值(undefined)的形式创建变量对象的属性。
所以原函数相当于:
所以输出了undefined和2。
被顶成-2?帮忙顶回去吧,这题并不是没有意义的题,涉及变量对象和执行上下文,要是函数和变量同名,情况又变了,个人愚见,不喜勿喷,这里本来就是问问题的地方。。
undefine
2
理清楚就简单了,首先
console.log(a)
var a解析为undefined
,所以输出undefined
console.log(foo())
输出函数的返回值无疑问,是js的预解析,了解一下输出结果:
But why? 因为
JavaScript
有个Just In Time Compilation
,所以实际上代码运行时并非完全你看到的这个样子,它会被"预编译"成以下样子:是否好理解了?
自己实验一下,F12打开,在控制台输入你上述代码,运行就看到结果了.
输出
第一个简单,因为a根本没有定义,所以undefined
第二个,function会提前声明,所以在调用foo()的时候,foo已经声明好了,如果是foo()则是调用foo,输出结果2,如果是foo则输出function foo(){return 2;}