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/