0
(function f(){ 
  function f(){ return 0; } 
  console.log(f()); 
  function f(){ return 1; } 
})();

为什么上面的代码给了我 1 作为结果?

4

2 回答 2

2

您定义了一个名为 的立即调用函数表达式 (IIFE) f。在 IIFE 的范围内,您定义了两个名为f. 由于提升了两个函数声明将被移动到范围的顶部,后者f将覆盖第一个f声明。

提升内部功能后:

(function f(){ 
  function f(){ return 0; } 
  function f(){ return 1; } 
  console.log(f()); 
})();
于 2016-02-28T17:50:04.013 回答
0

IIFE 在这里完全无关紧要,在 javascript 函数和变量中被提升,这就是你可以这样做的原因

hoisted(); // logs "foo"

function hoisted() {
  console.log("foo");
}

在定义之前调用函数的位置。
在您的示例中,代码在提升后最终成为

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

  console.log(f());  // logs "1"

在 MDN 上吊装

于 2016-02-28T17:53:21.433 回答