function myFunction() {
   function myInternalFunction() {
      return 10;
   }
   return myInternalFunction();
   function myInternalFunction() {
      return 20;
   }
}
alert(myFunction()); // What will this alert?

答案是20。
function myFunction() {
   var myInternalFunction = function() {
      return "Hello World.";
   }
   return myInternalFunction();
   var myInternalFunction = function() {
      return "Second Definition.";
   }
}
alert(myFunction()); // What will this alert?

答案是“ Hello World”。
为什么????为什么不“第二个定义” ????

最佳答案

悬挂了变量的声明,但没有定义。因此,您的第二个示例等效于:

function myFunction() {
   var myInternalFunction
   myInternalFunction = function() {
     return "Hello World."
   }
   return myInternalFunction()

   myInternalFunction = function() {
     return "Second Definition."
   }
}


在这里很明显,myInternalFunction是不可访问的,因此使用第一个定义,因为它是myInternalFunction调用时的值。 JSLint正确抱怨(使用您的原始代码):


  var之后无法访问return




与您的第一个示例进行比较,在该示例中悬挂了函数声明,因此您的代码等效于:

function myFunction() {
   function myInternalFunction() {
     return 10
   }
   function myInternalFunction() {
     return 20
   }
   return myInternalFunction()
}


正如我们在这里看到的,myInternalFunction立即被重新声明,因此最后一个获胜。这两个声明都在调用函数本身之前发生。




  因此,为什么此表达式最后提示变量:

var a = "one";
var a = "two";
alert(a); // alerts two ???? shouldn't be "one" if expressions?



这不等于您的函数示例;一个等效的示例是:

var a = "one"
alert(a)
var a = "two"


并期望它能够警告“两个”。我认为这显然不会。变量的值(无论是函数,字符串还是其他任何值)都不相关。

关于javascript - 功能提升的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23098361/

10-11 13:09