代码之家  ›  专栏  ›  技术社区  ›  Jack Roscoe

块样式真的很重要吗?[复制品]

  •  11
  • Jack Roscoe  · 技术社区  · 14 年前

    这个问题已经有了答案:

    我刚刚看了道格拉斯·克罗克福德关于他2009年的书《javascript:好的部分》的一段视频。

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

    return
    {
        ok: false
    };
    

    事实上应该这样写(强调尽管表面上相同,但行为差异至关重要):

    return {
        ok: false
    };
    

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

    我以前没有听说过这个,我想知道这个规则是否仍然适用,或者自这个声明发布以来,语法中的这个要求是否已经被JavaScript开发所克服。

    我发现这很有趣,因为我没有用这种方式编写代码,我想检查一下这个信息是否过期。

    7 回复  |  直到 14 年前
        1
  •  15
  •   Community CDub    7 年前

    无声的错误是 undefined 回来了!

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

    return
    {
        ok: false
    };
    

    被解析为

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

    JSLint 将识别此类模式并警告:

    皮棉警告: 意外的行尾;这些行是否为同一语句的一部分不明确

    皮棉警告: 缺少分号

    皮棉警告: 无法访问的代码

    皮棉警告: 无意义的块;花括号没有影响

    这一点已经在 "Strangest language feature" 问题。

        2
  •  3
  •   Matt user129975    14 年前

    这条规则仍然适用。

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

    return;
    
    {
        ok: false
    };
    

    即, undefined 返回。如果代码被允许通过 return 语句,然后将创建一个对象,但不会分配给任何有用的对象(变量)。

        3
  •  2
  •   Marco Mariani    14 年前

    javascript将在返回后插入分号,因为它“似乎丢失了”。

    接下来是一块好:假没有效果。

    所以这是JavaScript规范中的一个错误。

    我的建议是尽可能地运行jslint,并将其配置为在样式与crockford不同时允许使用样式。

        4
  •  0
  •   Gabriel Hurley    14 年前

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

        5
  •  0
  •   Community CDub    7 年前

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

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

        6
  •  0
  •   mathk    14 年前

    想知道为什么人们决定让这些东西成为可选的,添加分号几乎不会花你什么钱。 但是调试这种情况可能非常耗时。

    更一般地说,为什么语言设计者一直认为代码应该能够自我修复,避免用户的错误。 如果人们犯了错误,应该予以警告。否则你以后会遇到麻烦的。

    我们知道,你越晚发现错误,成本就越高。

        7
  •  0
  •   Guffa    14 年前

    在某些情况下,javascript“友好”到可以在换行符处使用分号。不久前我写了一篇关于这个的博客:

    Javascript – almost not line based

    关于RETURN语句的部分是:

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

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

    那么它的解释如下:

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

    RETURN语句采用 无参数形式和参数 成为自己的宣言。