最近我注意到 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
火狐输出:
ReferenceError: B is not defined
但是,如果我在调用之前放置 的定义,则 Firefox没有抱怨并且给出与其他浏览器相同的结果function B
,如下所示:
for(var i=0; i<10; i++) {
function B() {
console.log("B function. x = "+x);
}
if(condition) {
++x;
B();
}
}
基于来自 Mozilla 开发者网站的这句话:
函数调用时必须在作用域内,但函数声明可以在调用下方
我理解电话,A()
工作。但是我不清楚为什么 Firefox 和其他人在 call 的行为上存在差异B()
,当调用在定义之前。
在试图缩小原因时,我在这里读到了函数提升 ,它说 Firefox 在块内时不做提升,但在我的情况下,定义从来没有在语句中,所以我很困惑。if
if