【问题标题】:Is block style really this important? [duplicate]块样式真的这么重要吗? [复制]
【发布时间】:2011-03-01 13:48:57
【问题描述】:

我刚刚观看了 Douglas Crockford 关于他 2009 年出版的《JavaScript: The Good Parts》一书的演示视频。

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

return
{
    ok: false
};

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

return {
    ok: false
};

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

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

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

【问题讨论】:

  • 他是否解释了错误是什么以及行为差异是什么?
  • 是的,如果你看一下 32 分钟内的视频,你会看到他的完整解释。

标签: javascript


【解决方案1】:

静默错误是返回undefined

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

return
{
    ok: false
};

像被解析一样

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

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

lint 警告: 意外的行尾;这些行是否是同一语句的一部分是模棱两可的

lint 警告: 缺少分号

lint 警告:无法访问的代码

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

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

【讨论】:

  • return; 使函数返回 undefined,而不是 null
  • undefined 被返回,而不是null,不是吗?
  • @Delan @Matt 当然,更正了。干杯。
  • 也在wtfjs.com 上讨论过;)
【解决方案2】:

Javascript 会在返回后插入一个分号,因为它“好像不见了”。

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

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

我的建议是尽可能运行 jslint,并在与 Crockford 的风格不同时对其进行配置以适应你的风格。

【讨论】:

    【解决方案3】:

    规则仍然适用。

    因为语言自动插入“缺失”分号,所以第一个sn-p被解释为:

    return;
    
    {
        ok: false
    };
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 返回undefined,而不是null...
      【解决方案5】:

      这条规则今天也适用,是“坏处”之一。第一个代码 sn -p 将使函数返回undefined

      查看我关于此主题的其他答案:Semicolon in C++?

      【讨论】:

        【解决方案6】:

        Javascript 足够“友好”,在某些情况下可以在换行符处使用分号。实际上,我不久前写了一篇关于此的博客文章:

        Javascript – almost not line based

        关于return语句的部分是:

        但是,有几件事 你不能这样做。例如,如果你放一个 return 关键字之间的换行符 它的论点,它突然有了一个 不同的意思。如果你格式化 代码如下:

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

        然后是这样解释的:

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

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

        【讨论】:

          【解决方案7】:

          想知道为什么人们决定将内容设为可选,添加分号几乎不会花费您任何费用。 但是调试这种情况可能非常耗时。

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

          而且我们知道,越晚发现错误,代价越大。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-28
            • 2016-03-09
            • 2018-10-04
            • 2011-04-21
            相关资源
            最近更新 更多