3

请考虑以下代码:

function A() {
    console.log("first");
}

var f = A;

function A() {
    console.log("second");
}

var g = A;

f();
g();

它在萤火虫中输出“第一”,“第二”,这是我认为应该做的。
但它会在 Chrome 的控制台或 firefox 中输出“second”、“second”(从文件执行时,而不是在 firebug 中)。
为什么要更改保留在'f'中的引用我做第二个“函数A(){”??

似乎吊装是问题所在(请参阅下面的 apsillers 回答)。但是,为什么这个例子能正常工作(我的意思是第一秒输出):

var A = function A() {
    console.log("first");
}

var f = A;

A = function A() {
    console.log("second");
}

var g = A;

f();
g();

我在第二个函数声明中使用“A = ...”的事实阻止了这个函数的提升?

4

1 回答 1

7

函数声明被提升到其作用域的顶部,因此您的代码解释如下:

function A() {
    console.log("first");
}

// overwrite previous A
function A() {
    console.log("second");
}

// variable declarations are hoisted as well
// (not directly related to your problem here, but worth noting)
var f;
var g;

f = A;
g = A;

f();
g();

它在任何现代浏览器中产生 , 的输出secondsecond

在您的第二个示例中var A = ...,您现在使用的是函数表达式,而不是函数声明。函数表达式没有被提升。

萤火虫怪事

似乎——出于某种原因——Firebug 没有正确执行函数声明提升:

console.log(bar);  // this line incorrectly produces a ReferenceError!

function bar() { }

此代码段记录function bar() { }. 它在任何适当的浏览器环境中都这样做,但不是 Firebug。

编辑

Firebug 行为的原因是 Firebug 代码在 block 内运行,而函数声明在 blocks 中无效。但是,浏览器仍然会在非严格模式下处理它们,但它们处理它们的方式不同。Firefox 将它们视为未提升(而 IE 和 Chrome 确实提升了它们,因为它发生了)。

于 2013-06-05T15:35:11.267 回答