JSLint支持If-Block

时间:2011-08-07 05:12:12

标签: javascript jslint

在Javascript中,如果if表达式后面没有大括号,则将以下语句放在if块中。也就是说,

if(foo)
bar();
baz();

相当于

if(foo) {
  bar();
}
baz();

道格拉斯·克罗克福德建议不要使用第一个,因为如果程序员试图在没有括号的情况下向if块添加语句,这会让人感到困惑并导致难以追踪的错误。出于这个原因,JsLint抱怨你是否使用第一个表格。

我一直使用这个,如果你把语句放在与if语句相同的行上,我觉得这是一个非问题,如下所示:

if(foo) bar();
baz();

这比完整的支架形式更简洁,我从未对它产生过混淆。就这样我可以通过JsLint而没有那么多的视觉噪音我有时会使用一种依赖于操作员短路的较少惯用的形式,如下所示:

foo && bar();
baz();

你可能都在等我快点问一个问题,所以在这里: 如果正确格式化,在一行条件语句中不使用大括号通常被认为是不好的做法吗?为什么? JsLint有没有合理的理由抱怨它?

2 个答案:

答案 0 :(得分:5)

JSLint检查您的代码是否为Crockford样式。它有一个名为JSHint的分支,可以自定义,而且不那么讨厌。

这是一个验证良好的代码(除了可能很快修复的tiny bug之外)。

/*jshint curly: false */

var a = true;
function work() {
    console.log('work');
}

if (a) work();

答案 1 :(得分:4)

阅读:

  • 您可能不习惯这种编码风格,并且可能认为这会执行两个功能:

    if(foo) bar();
            baz();
    
  • 由于JS具有自动分号插入功能,因此甚至会出现更加模糊的情况。例如,我对ASI对此代码的处理方式感到不舒服,即使我可以解释它:

    if(foo) bar()
            baz()
    

    如果你知道ASI的作用,那么弄清楚甚至难以理解,但ASI是一个非常重要的算法。必须在脑海中运行它在时间上是昂贵的,所以如果你只是避免模棱两可(在这个意义上,根据ECMA-262规范不模糊)情况会更好。

  • 它使你的线条比他们需要的更长。根据您的编码惯例,这可能被认为是非问题,如果您的条件很长,并且您的陈述也是如此,由此产生的单行陈述对于要阅读的眼睛会更加沉重(众所周知,您的眼睛难以阅读非常单行,因此段落。

    如果你出于某种原因,你可以使用以下形式:

    if(foo)
        bar();
    

    这与你的代码几乎完全相同,但我认为没有理由,不要只是把括号放在那里。

写作:

  • 当您需要添加另一个语句时,您不会只是编写它。您必须重构周围区域才能执行此操作。同样,这并不难,但这是一个值得考虑的事情,这既不是你的问题也不是问题的解决方案,它只是一个语法上的怪癖。

    我认为你已经明白了这一点,但就是这种情况。

    初始代码:

    if(foo) bar();
    

    更改了代码:

    if(foo) bar(); baz();
    

    您可以清楚地看到问题,但可能不一定会在例行代码审查中弹出。如果您的测试用例没有涵盖这个特定的代码路径,那么由于重复的编码器疏忽,这可能会被推向生产阶段,这可以通过不要求明确分隔块来实现。 您可以采用的解决方案就是if(foo) bar() && baz(),但如果bar()是假的,那么这会失败,所以你最终会遇到像if(foo) (bar(), baz());这样丑陋的东西。是有效的,但显然非常难看。


就个人而言,我只在行非常短时使用单行if语句,算法本身也很短。像if(extra_loop) --i;if(!valid) break;之类的东西当你开始向这些单行ifs添加else时,结构变得越来越危险。

简而言之,您可以使用它,但使用它知道利弊,就像任何其他工具一样。