if语句内部的Javascript函数

if语句内部的Javascript函数,javascript,hoisting,Javascript,Hoisting,if语句中的javascript函数是如何处理的?js就是不这么做吗?下面的代码在浏览器中运行时效果良好。两秒钟后,它会提醒“嘿” <script> setTimeout(hey,2000) function hey(){ alert('hey') } </script> 突然,它抱怨说,嘿没有定义 现在,如果将回调从hey更改为function(){hey()},如下所示: <script> if(true){ setTimeout(functio

if
语句中的javascript函数是如何处理的?js就是不这么做吗?下面的代码在浏览器中运行时效果良好。两秒钟后,它会提醒“嘿”

<script>
setTimeout(hey,2000)
function hey(){
    alert('hey')
}
</script>
突然,它抱怨说,
嘿没有定义

现在,如果将回调从
hey
更改为
function(){hey()}
,如下所示:

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

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

如果(真){
setTimeout(函数(){hey()},2000)
函数hey(){
警惕(‘嘿’)
}
}
然后它再次开始工作,即使使用if语句。发生了什么事?显然。您看到的行为是Firefox特有的,其他地方的记录几乎相同

意译:

作品:

if ( hasRequiredJQueryVersion ) {
   // Test data here
   // Library code here
}
适用于除Firefox以外的所有

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

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

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

I您描述的问题。JFiddle接受了,我正在使用firefox。你可以直接将代码剪切粘贴到一个文件中,而不需要任何其他代码。这件事发生在我身上。两人都在这里工作。只是在Firefox上试用了一下,没有问题。对我来说也很有效。我认为您一定运行了一些不同于粘贴在此处的代码,从而导致了该错误:)您不必调用它
setTimeout
实际上分散了人们对真正问题的注意力,即Firefox的行为被破坏(或者至少与其他浏览器不同)。OP给出了一个示例,其中,即使函数没有被提升(如第二个示例所示),调用在第三个示例中仍然有效。我只是想解释一下这个看似矛盾的问题。批评它不是一个完整的答案,但它解决了问题的一部分(指出“真正的问题”并没有解决)。哦,很好,我开始觉得我疯了,因为其他人都说他们无法重现这个问题。有趣的是,人们提供的JSFIDLE仍然在Firefox上工作。为什么它可以在jsFiddle中工作,而不能在其他地方工作?@J-bob jsFiddle在Firefox中对我不起作用。除了rfornal的一个(我已经在上面评论过)实际上是坏的,因为他们错误地复制了问题。啊,是的,我(愚蠢地)没有意识到rfornal的JSFIDLE不会暴露问题,因为他们是如何将两个测试粘贴在一起的。
if ( true ) {
    testFunction();
    function testFunction() {
        alert(‘testFunction called’);
    }
}