为什么结果会根据大括号放置而有所不同?
我已经阅读了这篇文章 ,其中显示了一个例子。 请解释下面的代码片段为什么会因为大括号的位置发生变化而返回不同的结果。
带有大括号的示例{
换行符。
function test() { return { /* <----curly brace in new line */ javascript: "fantastic" }; } var r = test(); try { alert(r.javascript); // does this work...? } catch (e) { alert('no - it broke: ' + typeof r); }
test()
返回undefined
。
打开大括号的示例{
与return
相同的行。
function test() { return { /* <----inline curly brace */ javascript : "fantastic" }; } var r = test(); try { alert(r.javascript); // does this work...? } catch (e) { alert('no - it broke: ' + typeof r); }
test()
返回一个对象。
这里是现场示例提防大括号 。
这是javascript:自动分号插入的陷阱之一。 不以分号结尾但可能是语句结尾的行会自动终止,因此您的第一个示例看起来像这样:
function test() { return; // <- notice the inserted semicolon { javascript : "fantastic" }; }
另见http://javascript.crockford.com/code.html
在你的第二个例子中,你返回一个对象(由大括号构build的),属性为javascript,其值非常奇妙,实际上也是这样:
function test() { var myObject = new Object(); myObject.javascript = "fantastic"; return myObject; }
在语句结束时,Javascript并不需要分号,但缺点是必须猜测分号在哪里。 大多数情况下,这不是问题,但有时它会在你不想要的地方发现一个分号。
从我的博客文章中的一个例子( Javascript – 几乎不基于行 ):
如果你像这样格式化代码:
function getAnswer() { var answer = 42; return answer; }
然后它被这样解释:
function getAnswer() { var answer = 42; return; answer; }
return语句将其作为无参数的forms,而参数变成它自己的语句。
你的代码也一样。 该function解释为:
function test() { return; { javascript : "fantastic" }; }
这是因为JavaScript最经常提出“;” 在每一行的结尾,基本上当你有return的时候,javascript引擎看到会有更多的东西,而当它的新行被认为忘记放了“;”,并把它放在你的头上。
这里的花括号表示build造一个新的物体。 因此你的代码相当于:
function test() { var a = { javascript : "fantastic" }; return a; }
哪些工作,而如果你写:
function test() { var a = { javascript : "fantastic" }; return; // ; is automatically inserted a; }
它不再有效。
如上所述,问题确实是分号注入。 我刚刚读了一篇关于这个主题的好博客文章。 它解释了这个问题,以及更多关于JavaScript的内容。 它也包含一些很好的参考。 你可以在这里阅读
我个人比较喜欢Allman Style的可读性(vs K&R风格)。
代替…
function test() { return { javascript : "fantastic" }; }
我喜欢…
function test() { var obj = { javascript : "fantastic" }; return obj; }
但这是一个解决方法。 我可以和它一起生活。
不包括标准return;
原因。
换句话说 ,括号中的括号是从标准的其他类似C的laguanges中抽取的BAB HABBITS。 如果可读性是原因,那么我们也可以提供这个由你自己的laguanges写的variables名,但是我们不是这样做的正确吗? 新的行括号是坏的HABBITS ,并且,例如在谷歌浏览器,显示为debbuger错误。
当你和其他开发团队合作的时候,有99%的机会会因为IDE会自动标准化代码而被禁止。 像WebStorm / VisualStudio一样。
当你看github的时候,你会看到最stream行的是{
在同一行。
另外,每一行代码在laguanges中都应该有意义,大多数情况下不会被编译。 如何将“解释”到以下列开头的intepreter行:
{
? 这是块的开始? 我想你说的yes
。 现在告诉我你可以说多less:
function foo() {
(当然,我们正在讲的不是缩小的文件,我们也为此节省了很less的内存)
我不喜欢强制inteprer向前/向后。 它应该读取行,做两行不行的东西。
我相信ECMA 202X会将其作为STANDARD添加。 我自己并不在乎是否有人在他的项目中这样做,但是作为主要与程序员hipsterizing
的人,我不会接受这种代码的hipsterizing
化。
下一个案例将是如何添加CoffeScript / TypeScript和其他方言。 这些工具将返回你的代码与{
同一行。 为什么? 因为这是应该如何做的。
编辑:
我深入研究了这个问题,并且联系了ECMA团队
你好,我很确定,我可能不会得到答复。 但是我想知道ECMA团队喜欢什么。 JavaScript中的花括号会被写在同一行或新行? (不包括带“返回”的例子和自动分号插入的例子,我正在写我的论文,你的消息会像一些专业的POINT OF VIEW一样有帮助,谢谢你的工作。
作为Answere我得到这个:
TC39并没有像这样的造型师问题的任何官方立场。 我确信,参加TC39的成员代表中,您可以在代码格式上find各种选项。 不过,我怀疑大多数人会赞成使用明确的分号,而不是依靠ASI 。
- 从命令行(Node JS)运行脚本中的函数
- jqueryselectiframe的孩子
- 如何打破承诺链
- 不匹配的匿名define()模块
- Math.max.apply()如何工作?
- Angular-animate – 未知的提供者:$$ asyncCallbackProvider < – $$ asyncCallback < – $ animate < – $ compile
- 如何禁用警告“定义”不使用JSHint和RequireJS定义
- 电子build造者与电子包装者
- 为什么document.body.offsetHeight + document.body.bottomMargin不等于document.documentElement.offsetHeight