【问题标题】:Javascript function hoisting inside of if statements在 if 语句中提升 Javascript 函数
【发布时间】:2014-12-03 20:55:10
【问题描述】:

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
现在,如果您将回调从 hey 更改为 function(){hey()},如下所示:

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

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

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

【问题讨论】:

  • can't reproduce你描述的问题。
  • jsfiddle.net/r1oc1joh JFiddle 接受它。
  • 我正在使用火狐。您可以直接将该代码剪切并粘贴到文件中而无需任何其他代码,这发生在我身上。
  • 两人都在这里工作...jsfiddle.net/rfornal/3807s37n/1。刚刚在 Firefox 中尝试过,没有任何问题。
  • 也为我工作。我认为您必须运行一些与您在此处粘贴的代码不同的代码才会导致该错误:)

标签: javascript hoisting


【解决方案1】:

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 的行为可能技术上是正确的。

【讨论】:

  • 哦,太好了,我开始觉得我疯了,其他人都说他们无法重现这个问题。有趣的是,人们提供的 jsFiddles 仍然可以在 Firefox 上运行。为什么它可以在 jsFiddle 中工作,但不能在其他地方工作?
  • @J-bob JSFiddles 在 Firefox 中为我工作。他们都没有这样做,除了 rfornal 的那个(我在上面评论过)实际上被破坏了,因为他们错误地重现了问题。
  • 啊,是的,我(愚蠢地)没有意识到 rfornal 的 jsfiddle 不会暴露问题,因为他们将两个示例粘贴在一起。
【解决方案2】:

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

【讨论】:

  • 你不必调用它; setTimeout 实际上分散了真正问题的注意力,即 Firefox 的行为被破坏(或至少与其他所有浏览器不同)。它没有提升功能。
  • OP 举了一个例子,即使函数没有被提升(如第二个例子所示),调用在第三个例子中仍然有效。我只是想解释这个看似矛盾的地方。敲它不是一个完整的答案,但它解决了问题的一部分(指出“真正的问题”没有解决)。
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多