前几天同事发现的一个诡异现象,猜猜浏览器执行下面这段代码会弹出什么提示?
if(1){
f(1);
function f(a){
alert(a);
}
}
通常情况下,都认为javascript中function会被预解析,所以这里应该会弹出一个对话框,显示字符“1”。没错,在IE6-IE9,Chrome,Safari,Opera等待浏览器下也都是这个结果。但是偏偏Firefox有点特立独行,会提示“引用错误,f未定义”。
我们再试试,把if去掉,只留两个花括号看看:
{
f(1);
function f(a){
alert(a);
}
}
还是一样!现在我们在试试几种情况:
if(1){
function f(a){
alert(a);
}
f(1);
}
这个没有问题,正常显示1,再试试这个:
if(1){
function f(a){
alert(a);
}
}
f(1);
也没有问题,再试试这个:
if(0){
function f(a){
alert(a);
}
}
f(1);
这个果然不正常了,提示f未定义!看来是Firefox对花括号里面的函数声明做了特殊处理,并没有对花括号内部的函数声明做预解析,而只是等到要执行的时候才去解析,也许是为了性能优化?或者这本身就是一个bug?
个人觉得,最后一个有点像作用域问题.这样更接近其他语言
不过这确实是个bug
分析的很到位。赞
最后一个if的结果是false,里面的定义不会被编译的。没有任何问题。
xuxu太牛逼!