虽然我在google中找不到对此的引用,但我很熟悉这样一个事实,即在javascript中,全局函数声明在任何代码执行之前都会得到解释.换句话说,这很好用:
f();
function f() {}
Run Code Online (Sandbox Code Playgroud)
但是,我注意到chrome和firefox对全局函数声明的解释有不同的解释.特别是,chrome很高兴在第一遍中读取一个if块内的函数声明,但firefox却没有.
try {document.write(f);} // works in chrome
catch(e) {document.write(e.message);} // throws an error in firefox
try {document.write(g);} // works in chrome and firefox
catch(e) {document.write(e.message);}
if(true) function f() {}
function g() {}
Run Code Online (Sandbox Code Playgroud)
你可以用这个小提琴自己尝试这个例子.我使用的是Chrome 16.0.912.75和Firefox 9.0.1.
这种行为的ECMA标准是什么?这个"提升"函数声明的过程是否有一个术语高于其他代码?什么代码被"解除"对解释是开放的(两种浏览器都是正确的)?或者是其中一个中的错误?
请考虑以下代码:
function A() {
console.log("first");
}
var f = A;
function A() {
console.log("second");
}
var g = A;
f();
g();
Run Code Online (Sandbox Code Playgroud)
它在萤火虫中输出"第一","第二",这是我认为它应该做的.
但它在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();
Run Code Online (Sandbox Code Playgroud)
我在第二个函数声明中使用"A = ..."的事实阻止了这个函数的提升?