为什么结果因大括号放置而异?

问题描述 投票:87回答:6

为什么下面的代码片段取自this article,由于花括号的位置只有一个变化,会产生不同的结果?

当开场大括号qazxsw poi在新线上时,qazxsw poi返回qazxsw poi,并且警报中显示“no - it broke:undefined”。

{

当大括号与test()在同一条线上时,undefined会返回一个对象,并且会提醒“神奇”。

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}
javascript syntax
6个回答
133
投票

这是JavaScript的一个陷阱:自动分号插入。不以分号结尾但可能是语句结尾的行会自动终止,因此您的第一个示例看起来像这样:

return

另见test(),其中提到了分号插入。

在第二个示例中,返回一个对象(由花括号构建),其属性为function test() { return { /* <---- curly brace on same line */ javascript: "fantastic" }; } var r = test(); try { alert(r.javascript); // does this work...? } catch (e) { alert('no - it broke: ' + typeof r); },其值为function test() { return; // <- notice the inserted semicolon { javascript: "fantastic" }; } ,实际上与此相同:

Douglas Crockford's JS style guide

7
投票

Javascript在语句结尾处不需要分号,但缺点是它必须猜测分号的位置。大多数情况下这不是问题,但有时它会发明一个你不打算使用分号的分号。

我的博客文章中的一个例子(javascript):

如果您格式化代码如下:

"fantastic"

然后它被解释为这样:

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

return语句采用无参数形式,参数成为它自己的声明。

你的代码也是如此。该功能被解释为:

Javascript – almost not line based

1
投票

这是因为javascript最常放“;”在每一行的末尾,所以基本上当你返回{在同一行,javascript引擎看到会有更多的东西,当它在新行中它认为你忘了放“;”,并把它给你。


1
投票

这里的花括号表示新对象的构造。因此,您的代码相当于:

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

哪个有效,如果你写:

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

它不再有效。


1
投票

我个人更喜欢Allman Style的可读性(与K&R风格相比)。

代替…

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

我喜欢…

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

但这是一种解决方法。我可以忍受它。


0
投票

问题确实是如上所述的分号注射。我刚读了一篇关于这个主题的好文章。它解释了这个问题以及关于javascript的更多内容。它还包含一些很好的参考。你可以读它function test() { var a = { javascript : "fantastic" }; return; // ; is automatically inserted a; }

© www.soinside.com 2019 - 2024. All rights reserved.