参加考试:
<script>
function say() { alert( "ABOVE" ); }
say();
function say() { alert( "BELOW" ); }
</script>
答案 0 :(得分:3)
基本上,由于提升,它将所有函数声明拉到当前范围的顶部,解释器基本上是这样做的:
function say() { alert( "ABOVE" ); }
function say() { alert( "BELOW" ); }
say();
这就是为什么它总是警告below
答案 1 :(得分:1)
解释器首先读取函数的所有声明,然后执行函数外部的其他语句。所以后一种宣言优先于前者,这就是为什么后者被召唤的原因。
答案 2 :(得分:1)
在这种情况下,解释器首先解析函数定义,最后一个函数定义获胜。
此问题也已在Ambiguous function declaration in Javascript
中得到解答这里还有一篇好文章:http://kangax.github.com/nfe/
答案 3 :(得分:1)
(function () {
// even though not declared yet, every 'inner' function will be hoisted,
// and be available to the entire function
sing();
// variables are dealt with after functions, so say will be a string
// the order of declaration suggests this to be the case, but that isn't what matters
function say () { }
var say = "say";
// variables are dealt with after functions, so shout will be a string
// even though the order suggests shout should be a function
var shout = "shout";
function shout() { }
// both are functions, the latter one 'wins'
function sing() { console.log("sing1"); }
function sing() { console.log("sing2"); }
console.log(typeof say, typeof shout);
sing();
}())
输出:
sing2
string string
sing2
答案 4 :(得分:0)
这是因为后一种功能会覆盖前一种功能。如果您尝试记录该功能:
console.log(say);
它只会返回:
function say() { alert( "BELOW" ); }
“ABOVE”警告已被“BELOW”警报取代。类似于在同一范围内两次声明具有相同名称的变量 - 后者将覆盖前者。
为什么呢?见http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
答案 5 :(得分:0)
function xyz() { .. }
块在解析时定义。
如果许多函数具有相同的名称,则它是最后定义的优先级。
但是,您可以使用语句在运行时定义函数:
var say = function() { alert( "ABOVE" ); }
say();
say = function() { alert( "BELOW" ); }
将输出ABOVE
。
(JSFiddle)