JavaScript中的单行语句需要花括号吗?

我曾经听说,在单行表述中留下大括号可能对JavaScript有害。 我不记得推理,谷歌search没有什么帮助。 有没有什么可以把JavaScript中大括号内的所有语句括起来?

我在问,因为每个人似乎都这样做。

没有

但是他们被推荐。 如果你扩大陈述,你将需要他们。

这是完全有效的

if (cond) alert("Condition met!") else alert("Condition not met!") 

不过,强烈build议您总是使用大括号,因为如果您(或其他人)曾经扩展这个陈述,那么将会是必需的。

所有C语法风格的语言都遵循同样的做法。 C,C ++,Java,甚至PHP都支持一个没有大括号的行语句。 你必须认识到,你只是保存两个字符,并与一些人的支撑风格,你甚至没有保存一条线。 我更喜欢一个完整的支撑风格(如下),所以它往往会更长一点。 与代码可读性非常好的事实相得益彰。

 if (cond) { alert("Condition met!") } else { alert("Condition not met!") } 

有一个可读性方面 – 因为当你有复合报表时,它会变得非常混乱。 (缩进有帮助,但对编译器/解释器没有任何意义)

 var a; var b; var c; //Indenting is clear if (a===true) alert(a); //On on IF alert(b); //Always //Indenting is bad if (a===true) alert(a); //On on IF alert(b); //Always but expected? //Nested indenting is clear if (a===true) if (b===true) alert(a); //Only on if-if alert (b); //Always //Nested indenting is misleading if (a===true) if (b===true) alert(a); //Only on if-if alert (b); //Always but expected as part of first if? //Compound line is misleading //b will always alert, but suggests it's part of if if (a===true) alert(a);alert(b); else alert(c); //Error, else isn't attached 

然后是可扩展性方面:

 //Problematic if (a===true) alert(a); alert(b); //We're assuming this will happen with the if but it'll happen always else //This else is not connected to an if anymore - error alert(c); //Obvious if (a===true) { alert(a); //on if alert(b); //on if } else { alert(c); //on !if } 

(思想是,如果你总是有括号,那么你知道在该块内插入其他语句)。

这个问题在一条线上发表声明。 然而,所提供的许多例子显示了不会因多行语句而遗漏大括号的原因。 如果这是你喜欢的编码风格,在一行上不使用括号是完全安全的。

例如,问题是否确定:

  if (condition) statement; 

它不问这是否正确:

  if (condition) statement; 

我认为把括号放在外面是可取的,因为它使得代码更加可读,语法更简单。

我的编码风格是从来没有使用括号,除非代码是块。 并且不要在一行中使用多个语句(用分号分隔)。 我觉得这很容易阅读和清楚,从来没有“if”语句的范围问题。 因此,在单个条件语句中使用括号将需要3行。 喜欢这个:

  if (condition) { statement; } 

如果使用一行if语句是可取的,因为它使用较less的垂直空间并且代码更紧凑。

我不会强迫别人使用这种方法,但是对我来说这是有效的,我不能不同意使用括号括起来导致编码/范围错误的例子。

没有可维护性问题!

所有人的问题是,你把分号放在任何地方。 你不需要用大括号来表示多个语句。 如果你想添加一个语句,只需使用逗号。

 if (a > 1) alert("foo"), alert("bar"), alert("lorem"), alert("ipsum"); else alert("blah"); 

这是有效的代码,将运行像你期望的!

这是一个风格问题,但大括号可以防止其他可能的晃动 。

除了@Josh K(也适用于Java,C等)提到的原因之外,JavaScript中的一个特殊问题是自动分号插入 。 从维基百科的例子:

 return a + b; // Returns undefined. Treated as: // return; // a + b; 

所以,如果使用这样的话,这也可能会产生意想不到的结果:

 if (x) return a + b; 

写作并不是一件好事

 if (x) { return a + b; } 

但也许这里的错误是更容易检测(?)

绝对没错

忘记“这是个人喜好”,“代码将运行得很好”,“它一直工作得很好”,“更可读”亚达亚达BS。

参数:“这是个人喜好”

不它不是。 除非你是一个一个人离开火星队,否则。 大多数时候会有其他人阅读/修改你的代码。 在任何严肃的编码团队中,这将是推荐的方式,所以这不是“个人偏好”。

参数:“代码将运行得很好”

那么意大利面代码呢! 这是否意味着创build它?

参数:“对我来说工作正常”

在我的职业生涯中,我看到了由于这个问题而造成的很多错误。 你可能不记得你有多less次评论过'DoSomething()'并为什么'SomethingElse()'被调用而感到困惑:

 if (condition) DoSomething(); SomethingElse(); 

或者添加“SomethingMore”,但没有注意到它不会被调用(即使缩进意味着其他情况):

 if (condition) DoSomething(); SomethingMore(); 

这是我的一个真实生活的例子。 有人想要打开所有日志logging,以便运行查找和replace"Console.println" => //"Console.println"

 if (condition) Console.println("something"); SomethingElse(); 

看到问题?

即使你认为,“这些都是如此微不足道,我绝不会这样做”。 记住,总是会有一个编程能力低于你的团队成员(希望你不是团队中最差的)!

参数:“更可读”

如果我学到了编程方面的知识,简单的事情就会变得非常复杂。 这是很常见的:

 if (condition) DoSomething(); 

经过不同浏览器/环境/用例的testing后会变成以下内容或添加新function:

 if (a != null) if (condition) DoSomething(); else DoSomethingElse(); DoSomethingMore(); else if (b == null) alert("error b"); else alert("error a"); 

并与此相比较:

  if (a != null) { if (condition) { DoSomething(); } else { DoSomethingElse(); DoSomethingMore(); } } else if (b == null) { alert("error b"); } else { alert("error a"); } 

PS:奖励积分转到谁在上面的例子中发现了这个bug

在一行语句中使用大括号没有编程原因。

这只能归结为编码人员的偏好和可读性。

你的代码不会因为它而中断。

这是推荐的原因

比方说,我写

 if(someVal) alert("True"); 

然后下一个开发者来说,“哦,我需要做别的事情”,所以他们写

 if(someVal) alert("True"); alert("AlsoTrue"); 

现在你可以看到“AlsoTrue”将永远是真实的,因为第一个开发者没有使用大括号。

我目前正在制作一个缩小器。 即使现在我也检查了两个巨大的脚本。 实验上我发现:如果花括号不包括';','return','for','if','else',则可以删除后面的花括号。 “而”,“做”,“function”。 不分行。

 function a(b){if(c){d}else{e}} //ok function a(b){if(c)d;else e} //ok 

当然,如果没有在其他右大括号后面跟上,则需要用分号replace右大括号。

函数不能以逗号结尾。

 var a,b=function()c; //ok *but not in Chrome var b=function()c,a; //error 

在Chrome和FF上testing。

有时他们似乎是需要的! 我自己也不敢相信,但是昨天在Firebug会议上(最近Firefox 22.0)发生了这样的事情

 if (! my.condition.key) do something; 

执行尽pipemy.condition.key真的 。 添加大括号:

 if (! my.condition.var) { do something; } 

解决了这个问题。 有大量的例子,它显然没有大括号的作品,但在这种情况下,它绝对没有。

那些倾向于把一个以上的陈述写在一行上的人应该总是使用大括号,当然,因为这样的东西

 if (condition) do something; do something else; 

很难find。

我只想指出,你也可以把大括号从别的地方留下。 正如John Resig所写的这篇文章所见。

 if(2 == 1){ if(1 == 2){ console.log("We will never get here") } } else console.log("We will get here") 

在javascript中有很多问题。 看看JavaScript架构师道格拉斯·克罗克福德(Douglas Crockford)谈论这个if语句似乎很好,但是return语句可能会引入一个问题。

 return { ok:false; } //silent error (return undefined) return{ ok:true; } //works well in javascript 

有一种方法来实现多线非花括号,如果声明..(哇什么英语..),但它是有点泰迪:

 if(true) funcName(); else return null; function funcName(){ //Do Stuff Here... }