实际上调用了几个名称相同的JavaScript函数中的哪一个?

时间:2011-05-31 10:21:56

标签: javascript function scope

我正在Chrome控制台中尝试此测验:Quiz

我无法理解为什么这段代码的答案是2

 (function f(){
          function f(){ return 1; }
          return f();
          function f(){ return 2; }
        })();

此行return f();中调用哪个f? 功能的顺序是什么?

3 个答案:

答案 0 :(得分:7)

函数是作用域的(因此,同名函数内的函数只有在调用它时才会覆盖外部函数)并被提升(因此它们在代码顺序中出现的位置无关紧要),最后一个函数会覆盖第一个。

答案 1 :(得分:2)

问题和答案就是许多人所说的Hoisting

这样的函数声明在执行时不在parsing time解释。简单来说,第二个函数声明f()会覆盖第一个,因此返回值为2

function declarationsscoped 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 );
}());