前几天同事发现的一个诡异现象,猜猜浏览器执行下面这段代码会弹出什么提示?

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?

4 Comments

  1. 个人觉得,最后一个有点像作用域问题.这样更接近其他语言
    不过这确实是个bug

  2. 最后一个if的结果是false,里面的定义不会被编译的。没有任何问题。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.