为什么JavaScript中的“continue”声明不好?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

在书中Javascript:好部分道格拉斯克罗克福德,这是所有作者不得不说继续声明:

continue语句跳转到循环的顶部。我从来没有见过一段代码没有通过重构来删除continue语句而得到改进。

这真让我困惑。我知道Crockford在JavaScript上有一些非常有见地的观点,但这听起来完全错误。

首先,continue不仅仅是跳到循环的顶部。默认情况下,它也会前进到下一次迭代。那么克罗克福德的言论不完全是虚假信息?

更重要的是,我不完全明白为什么continue甚至会被认为是不好的。这篇文章提供了似乎是一个普遍的假设: 为什么在一个循环内继续一个坏主意?

虽然我知道continue在某些情况下可能会使代码难以阅读,但我认为它可能会使代码更具可读性。例如:

var someArray=['blah',5,'stuff',7];
for(var i=0;i<someArray.length;i++){
    if(typeof someArray[i]==='number'){
        for(var j=0;j<someArray[i];j++){
            console.log(j);
        }
    }
}

这可以重构为:

var someArray=['blah',5,'stuff',7];
for(var i=0;i<someArray.length;i++){
    if(typeof someArray[i]!=='number'){
        continue;
    }
    for(var j=0;j<someArray[i];j++){
        console.log(j);
    }
}

continue在这个特定的例子中并不是特别有益,但它确实证明了它降低了嵌套深度的事实。在更复杂的代码中,这可能会增加可读性。

克罗克福德没有解释为什么continue不应该使用,那么这个意见背后有什么更深的意义,我错过了?

提问于
用户回答回答于

这个陈述很荒谬。continue可以被滥用,但它往往有助于可读性。

典型用途:

for (somecondition)
{
    if (!firsttest) continue;

    some_provisional_work_that_is_almost_always_needed();

    if (!further_tests()) continue;

    do_expensive_operation();
}

目标是避免'lasagna'的代码,你有深嵌套的条件。

用户回答回答于

我个人比这里的大多数人都多。这个问题通常不是用所示的continue模式,而是用更深的嵌套模式,在可能的代码路径可能很难看到的地方。

但即使你的榜样continue在我看来没有改善,这是有道理的。根据我的经验,一些continue语句是稍后重构噩梦(甚至对于更适合像Java这样的自动重构的静态语言,特别是稍后有人也break会这样做)。

因此,我会为您提供的报价添加评论:

重构删除continue语句会降低重构的进一步能力。

内循环真的很适合例如提取功能。当内部循环变得复杂并且continue可能使其变得痛苦时,这种重构就完成了。

这些是我在团队中专业处理JavaScript项目之后的诚实意见,道格拉斯克罗克福德谈论的规则确实体现了他们的优点。

扫码关注云+社区