Javascript函数在if语句中提升

时间:2014-12-03 20:55:10

标签: javascript hoisting

if语句中提升javascript函数的处理是什么? js不这样做吗?以下代码在浏览器中运行时效果很好。它会警告"嘿嘿"两秒后。

<script>
setTimeout(hey,2000)
function hey(){
    alert('hey')
}
</script>

但是围绕这个添加了一个trival if语句:

<script>
if(true){
setTimeout(hey,2000)

function hey(){
    alert('hey')
}
}
</script>

然后突然抱怨hey is not defined 现在,如果您将回调从hey更改为function(){hey()},请执行以下操作:

<script>
if(true){
setTimeout(function(){hey()},2000)

function hey(){
    alert('hey')
}
}
</script>

然后它再次开始工作,即使使用if语句也是如此。那是怎么回事?

2 个答案:

答案 0 :(得分:4)

显然,{p> Firefox doesn’t hoist function declarations in blocks。您所看到的行为特定于Firefox,并且在其他地方几乎完全相同。

用来解释:

  

使用:

if ( hasRequiredJQueryVersion ) {
   // Test data here
   // Library code here
}
     

无处不在除了 Firefox:

if ( true ) {
    testFunction();
    function testFunction() {
        alert(‘testFunction called’);
    }
}

这是您应该避免的行为,因为它特定于Firefox,即使Firefox的行为技术上是正确的。

答案 1 :(得分:-2)

第三个例子与第二个例子是一致的:setTimeout实际上并没有调用hey,因此不关心它是否已被定义。只有当超时发生时才调用hey已定义