js中函数预解析在Firefox下的异常表现

Posted on September 09, 2011 by Fdream

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

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?

分享 |
Categories:
Ajax Web
Tags:
,
Comments:
2 Comments
Views:
1,155 Views

Related Posts

2 Responses to <js中函数预解析在Firefox下的异常表现>

  1. sweetbai says:

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

  2. 天宝哥哥 says:

    分析的很到位。赞

Leave a Reply

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

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>