块样式真的这么重要吗?

时间:2010-06-09 09:18:54

标签: javascript

我刚刚观看了道格拉斯·克罗克福德关于2009年着作“JavaScript:好零件”的演讲视频。

在视频中,他解释说下面的块很危险,因为它会产生无声错误:

return
{
    ok: false
};

它实际上应该这样写(强调虽然看似相同,但行为差异至关重要):

return {
    ok: false
};

您可以在视频大约32分钟左右看到他的评论:http://www.youtube.com/watch?v=hQVTIJBZook&feature=player_embedded#!&start=1920

我之前没有听过这个,并且想知道这个规则是否仍然适用,或者自从发表这个声明以来JavaScript的发展是否已经克服了这种语法要求。

我发现这非常有趣,因为我没有用这种方式编写代码,并想检查这些信息是否过时。

7 个答案:

答案 0 :(得分:15)

无声错误是返回undefined

分号在JavaScript中是可选的,因此

return
{
    ok: false
};

被解析为好像是

return;  // Leaves function straight away
{
    ok: false   
};

JSLint会认出这些模式并对其发出警告:

  

lint警告:意外结束;这些行是否是同一陈述的一部分是不明确的

     

lint警告:缺少分号

     

lint警告:无法访问的代码

     

lint警告:无意义的阻止;花括号没有影响

这已经在"Strangest language feature"问题中讨论过。

答案 1 :(得分:3)

该规则仍然适用。

因为语言会自动插入“缺失”的分号,所以第一个片段被解释为:

return;

{
    ok: false
};

即,返回undefined。如果代码以某种方式被允许运行return语句,那么将创建一个对象,但不会将其分配给任何有用的(变量)。

答案 2 :(得分:2)

Javascript将在返回后插入分号,因为它“似乎缺失”。

以下是{ok:false}的一个无效的块。

所以这是javascript规范中的一个错误..

我的建议是尽可能运行jslint,并将其配置为允许你的风格与Crockford的风格不同。

答案 3 :(得分:0)

这是一个非常现实的问题。无意中返回null肯定会在代码中做坏事!

答案 4 :(得分:0)

该规则今天也适用,并且是“坏部分”之一。第一个代码段将使函数返回undefined

请参阅我关于此主题的其他答案:Semicolon in C++?

答案 5 :(得分:0)

Javascript“友好”足以在某些情况下在换行符处假设分号。我实际上在不久前写了一篇博客文章:

Javascript – almost not line based

关于return语句的部分是:

  

然而,有一些事情   你不能这样做。如果你举个例子   return关键字之间的换行符   它的论点是,它突然有了   不同的意思。如果你格式化   像这样的代码:

function getAnswer() {
  var answer = 42;
  return
    answer;
} 
  

然后它被解释为:

function getAnswer() {
  var answer = 42;
  return;
  answer;
} 
  

return语句接受它   无参数形式和参数   成为它自己的陈述。

答案 6 :(得分:0)

想知道为什么人们决定制作可选的东西,几乎没有任何东西可以添加分号。 但调试这种情况可能非常耗时。

更一般地说,为什么语言设计师一直认为代码应该从用户错误中自我修复。 如果人们犯了错误,应该警告。否则你会在以后及之后遇到麻烦。

我们知道,你越弄错了,它就越贵。