Chrome如何管理对javascript构造函数的引用

时间:2013-06-05 15:30:57

标签: javascript google-chrome

请考虑以下代码:

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

var f = A;

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

var g = A;

f();
g();

它在萤火虫中输出“第一”,“第二”,这是我认为它应该做的 但它在Chrome控制台或firefox中输出“秒”,“秒”,(从文件执行时,而不是在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 = ...”的事实阻止了这个函数的提升?

1 个答案:

答案 0 :(得分:7)

函数声明为hoisted to the top of their scope,因此您的代码解释如下:

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代码在块内运行,function declarations are not valid in blocks。但是,浏览器仍会在非严格模式下处理它们,但它们处理它们的方式有何不同。 Firefox将它们视为无线(虽然IE和Chrome确实会提升它们)。