在Douglas Crockford的Javascript: the Good Parts一书中,这是作者对continue语句的所有看法:
continue
语句跳转到循环的顶部。我从来没有见过一段代码没有通过重构来删除continue
语句而得到改进。
这真的让我很困惑。我知道克罗克福德对JavaScript有一些非常固执己见的观点,但这在我看来是完全错误的。
首先,continue
不仅仅是跳到循环的顶部。默认情况下,它还会前进到下一次迭代。那么Crockford的陈述不就是完全错误的信息吗?
更重要的是,我不完全理解为什么continue
会被认为是不好的。这篇文章似乎提供了一个普遍的假设:Why is continue inside a loop a bad idea?
虽然我理解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
,那么在我遗漏的这个观点背后是否有更深层次的意义呢?
发布于 2012-07-31 04:04:30
这句话太荒谬了。continue
可能会被滥用,但它通常有助于提高可读性。
典型用法:
for (somecondition)
{
if (!firsttest) continue;
some_provisional_work_that_is_almost_always_needed();
if (!further_tests()) continue;
do_expensive_operation();
}
这样做的目的是避免“千层面”代码,在这种代码中,你会有很深的嵌套条件句。
编辑后添加的:
是的,这最终是主观的。Here's my metric for deciding.
最后一次编辑:
当然,这个示例太简单了,而且您总是可以用函数调用替换嵌套的条件。但是,您可能必须通过引用将数据传递给嵌套函数,这可能会产生至少与您试图避免的重构问题一样严重的重构问题。
发布于 2012-07-31 05:53:55
我个人站在另一边,而不是这里的大多数人。问题通常不在于所显示的continue
模式,而在于嵌套更深的模式,其中可能的代码路径可能变得难以看到。
但在我看来,即使您的示例只有一个continue
,也没有显示出合理的改进。根据我的经验,一些continue
语句对于以后重构来说是一场噩梦(甚至对于更适合自动重构的静态语言也是如此,特别是当有人后来也将break
放在那里时)。
因此,我将在您给出的引文中添加一个注释:
删除continue
语句的
重构提高了您进一步重构的能力。
内循环对于提取函数来说是非常好的候选。这样的重构是在内部循环变得复杂时进行的,然后continue
可能会让它变得很痛苦。
这些是我在团队中从事JavaScript项目的专业工作后的诚实意见,Douglas Crockford谈到的规则确实显示了他们的优点。
发布于 2014-07-27 09:10:45
Douglas 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();
}
这可能是他不喜欢继续的部分原因。
https://stackoverflow.com/questions/11728757
复制相似问题