我刚刚观看了道格拉斯·克罗克福德关于2009年着作“JavaScript:好零件”的演讲视频。
在视频中,他解释说下面的块很危险,因为它会产生无声错误:
return
{
ok: false
};
它实际上应该这样写(强调虽然看似相同,但行为差异至关重要):
return {
ok: false
};
您可以在视频大约32分钟左右看到他的评论:http://www.youtube.com/watch?v=hQVTIJBZook&feature=player_embedded#!&start=1920
我之前没有听过这个,并且想知道这个规则是否仍然适用,或者自从发表这个声明以来JavaScript的发展是否已经克服了这种语法要求。
我发现这非常有趣,因为我没有用这种方式编写代码,并想检查这些信息是否过时。
答案 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)
想知道为什么人们决定制作可选的东西,几乎没有任何东西可以添加分号。 但调试这种情况可能非常耗时。
更一般地说,为什么语言设计师一直认为代码应该从用户错误中自我修复。 如果人们犯了错误,应该警告。否则你会在以后及之后遇到麻烦。
我们知道,你越弄错了,它就越贵。