3

做一个测试:

<script>
    function say() { alert( "ABOVE" ); }

    say();

    function say() { alert( "BELOW" ); }
</script>
  • 所有测试(Chrome、Firefox、IE)的结果都是“低于”。
  • 在这种情况下,javascript 解释器如何工作?
  • http://jsfiddle.net/jcv6l/ << 运行代码。
4

6 回答 6

3

基本上,由于提升,将所有函数声明拉到当前范围的顶部,解释器基本上是这样做的:

function say() { alert( "ABOVE" ); }
function say() { alert( "BELOW" ); }
say();

这就是为什么它总是以警报告终below

于 2013-04-04T11:52:26.917 回答
1

解释器首先读取函数的所有声明,然后执行函数外部的其他语句。所以后者的声明覆盖了前者,这就是后者被调用的原因。

于 2013-04-04T11:54:47.940 回答
1

在这种情况下,解释器首先解析函数定义,最后一个函数定义获胜。

这个问题也得到了回答:Javascript中的模糊函数声明

这里也有一篇不错的文章:http: //kangax.github.com/nfe/

于 2013-04-04T11:55:22.237 回答
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
于 2013-04-04T11:57:24.950 回答
0

这是因为后一个函数覆盖了前一个函数。如果您尝试记录该功能:

console.log(say);

它只会返回:

function say() { alert( "BELOW" ); } 

“上方”警报已替换为“下方”警报。类似于在同一范围内两次声明具有相同名称的变量 - 后者将覆盖前者。

JSFiddle 示例

为什么?请参阅http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

于 2013-04-04T11:52:00.043 回答
0

function xyz() { .. }块是在解析时定义的。如果许多函数具有相同的名称,则它是最后定义的优先。


但是,您可以在运行时使用 statements 定义函数:

var say = function() { alert( "ABOVE" ); }
say(); 
say = function() { alert( "BELOW" ); }

将输出ABOVE. ( JSFiddle )

于 2013-04-04T11:58:36.483 回答