最近我注意到Firefox和其他浏览器之间存在以下javascript代码的行为差异:
var condition = true;
A();
function A() {
var x=0;
for(var i=0; i<10; i++) {
if(condition) {
++x;
B();
}
function B() {
console.log("B function. x = "+x);
}
}
}
Chrome,Opera,IE输出:
B function. x = 1
B function. x = 2
B function. x = 3
B function. x = 4
B function. x = 5
B function. x = 6
B function. x = 7
B function. x = 8
B function. x = 9
B function. x = 10
Firefox输出:
ReferenceError: B is not defined
然而,如果我在调用之前输入function B
的定义,那么来自Firefox的没有投诉并提供与其他浏览器相同的相同结果,像这样:
for(var i=0; i<10; i++) {
function B() {
console.log("B function. x = "+x);
}
if(condition) {
++x;
B();
}
}
基于Mozilla开发者网站的引用:
函数在调用时必须在范围内,但函数声明可以在调用
之下
我理解通话,A()
有效。但是,当调用在定义之前时,我不清楚为什么Firefox和其他人在调用B()
时的行为有所不同。
在尝试缩小原因的同时,我读到了功能提升 here,其中说Firefox在if
块内没有挂起,但定义从未在我的案例中if
语句中,所以我很困惑。
答案 0 :(得分:3)
Firefox也不会在for
块之外提升函数声明。 ECMA标准说没关系。您链接到的文档不仅适用于if
块,也适用于for
块。