-->

为什么“继续”在JavaScript语句不好?(Why are “continue” stateme

2019-06-26 14:52发布

在这本书中的Javascript:由Douglas Crockford的好的部分 ,这是所有的作者有话要说关于continue语句:

continue语句跳到循环的顶部。 我从来没有见过的一段代码,这不是通过重构其去除提高continue发言。

这确实让我困惑。 我知道克罗克福德对JavaScript的一些很自以为是的看法,但这只是听起来完全是我错了。

首先, continue并不仅仅是跳转到一个循环的顶端。 默认情况下,它也前进到下一个迭代。 所以是不是Crockford的说法只是完全错误的信息?

更重要的是,我并不完全明白为什么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不应该被使用,所以是有这背后的意见,我错过了一些更深层次的意义是什么?

Answer 1:

该声明是荒谬的。 continue可能会被滥用,但它常常有助于可读性。

典型用途:

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

    some_provisional_work_that_is_almost_always_needed();

    if (!further_tests()) continue;

    do_expensive_operation();
}

我们的目标是避免“烤宽面条”的代码,在这里你有深刻嵌套条件。

编辑补充:

是的,这是最终的主观。 这是我的决定指标。

编辑最后一次:

这个例子太简单了,当然,你可以随时与函数调用替换嵌套条件。 但你可能要传递数据作为参考嵌套函数,它至少可以作为不良创建重构问题,你想避免的。



Answer 2:

我个人对对方比大多数在这里。 这个问题通常是不与显示continue的模式,但更多的深度嵌套的,如果可能的代码路径可能会变得很难看。

但是,即使你用一个例子continue不显示在我认为是合理的改进。 从我的经验少数continue陈述后重构 (即使是静态语言更适合像Java自动重构,特别是当后来有人提出有一场噩梦 break太)。

因此,我会增加你给报价评论:

重构删除continue陈述inreases您的进一步重构能力。

而内循环是如提取功能确实不错candidated。 当内循环变得复杂这样的重构完成,然后continue可能使其痛苦。

这些都是我在团队上的JavaScript项目专业工作之后诚实的意见,有规则,关于真道格拉斯Crockford的会谈显示出他们的优点。



Answer 3:

道格拉斯Crockford的可能有这样的感觉,因为他不内有条件分配相信。 事实上,他的节目的JSLint甚至不会让你这么做,即使JavaScript本身。 他绝不会写:

实施例1

while (rec = getrec())
{   
    if (condition1(rec))
        continue;

    doSomething(rec);
}

但是,我猜他写是这样的:

实施例2

rec = getrec();

while (rec)
{   
    if (!condition(rec))
        doSomething(rec);

    rec = getrec();
}

这两个工作,但如果你不小心混合这几种方式你得到一个无限循环:

实施例3

rec = getrec();

while (rec)
{   
    if (condition1(rec))
        continue;

    rec = getrec();
}

这可能是为什么他不喜欢不断的一部分。



Answer 4:

继续是在算法节省计算周期的一个非常有用的工具。 当然,也可以使用不当,但这样可以每隔关键字或方法。 当追求性能,它可以采取相反的方法路径发散与条件语句是有用的。 甲继续可以通过允许低效路径便于逆被跳过时可能的。



Answer 5:

其实,从所有的分析看来:

  1. 如果你有浅循环-随意使用继续当且仅当它提高了可读性(也可能有一些性能提升?)。
  2. 如果你有深嵌套循环(这意味着你已经有一个毛球当你重新因子解开)避免继续可能被证明是从代码的可靠性的观点来看是有利的。

在道格拉斯Crokford的防守,我觉得他的建议往往倾向于瘦防御性编程 ,其中,在所有诚实似乎是“傻瓜打样”在企业中的代码的好方法。



Answer 6:

就个人而言,我从来没有听说过什么不好使用continue语句。 这是事实,它可能(大部分时间)很容易地避免,但没有理由使用它。 我发现,循环可以有很多清洁期待与更具可读性继续在地方语句。



文章来源: Why are “continue” statements bad in JavaScript?