我正在Chrome控制台中尝试此测验:Quiz
我无法理解为什么这段代码的答案是2
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
此行return f();
中调用哪个f?
功能的顺序是什么?
答案 0 :(得分:7)
函数是作用域的(因此,同名函数内的函数只有在调用它时才会覆盖外部函数)并被提升(因此它们在代码顺序中出现的位置无关紧要),最后一个函数会覆盖第一个。
答案 1 :(得分:2)
问题和答案就是许多人所说的Hoisting
。
这样的函数声明在执行时不在parsing time
解释。简单来说,第二个函数声明f()
会覆盖第一个,因此返回值为2
。
在function declarations
和scoped variables
上进行吊装(与var
一起声明)。例如:
(function() {
if( false ) {
var hello = 10;
}
console.log( hello );
}());
console.log将返回undefined
并且不会在此处引发异常。即使从未遇到过if statement
,变量也在function context
内声明。
答案 2 :(得分:2)
在编译时,声明将在 f 范围内提升。它在运行时看起来像这样:
(function f(){
function f(){ return 1; }
function f(){ return 2; }
return f();
})();
jAndy示例如下所示:
(function() {
var hello;
if( false ) {
hello = 10;
}
console.log( hello );
}());