3

if在语句中提升 javascript 函数是怎么回事?js只是不这样做吗?以下代码在浏览器中运行时运行良好。它会在两秒钟后发出“嘿”的警报。

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

但是围绕这个添加一个琐碎的if声明:

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

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

突然它抱怨说hey is not defined
现在,如果您将回调从 更改heyfunction(){hey()},如下所示:

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

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

然后它再次开始工作,即使使用 if 语句。发生什么了?

4

2 回答 2

4

显然, Firefox 不会在 blocks 中提升函数声明。您看到的行为特定于 Firefox,并且在其他地方几乎相同地记录。

转述:

作品:

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

适用于Firefox 之外的任何地方:

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

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

于 2014-12-03T21:04:28.033 回答
-2

第三个示例与第二个示例一致:setTimeout实际上不是在调用hey,所以不在乎它没有被定义。只有在发生超时时才hey被调用,此时已定义了该

于 2014-12-03T21:06:16.780 回答