为什么JavaScript中有这么多分号
Why so many semicolons in JavaScript?
我在JavaScript中经常使用分号:
var x = 1;
var y = 2;
if (x==y){do something};
我最近注意到,我在看很多JavaScript,没有分号后面的if语句。然后我突然想到,我甚至不知道在JS中分号的首选语法,经过一些谷歌搜索(相当令人惊讶),除了拆分一行语句外,根本不需要分号。
所以,这个问题…人们使用分号的习惯是从哪里来的呢?它是JavaScript开始发挥作用时正在使用的流行语言的残余吗?只是一般的好习惯?只有我这样吗?
我可能会坚持使用它,因为它在编写jQuery链时很容易发现结束。
更新:谢谢大家的回答!总结一下,我们在JS中看到很多分号的原因,即使是不需要的,也来自于各种变量:
- 旧的JS最小化器会产生破碎的代码,如果你没有插入分号
- 许多其他语言使用它们,所以这是一个继承的习惯 有时候,分号可以改变逻辑
- 有些人更喜欢使用它们来使代码更易于人类阅读
许多计算机语言使用分号表示语句的结束。C、c++和Java就是这样的例子。
尽管它们是可选的,但为什么人们会使用它们,因为它们提高了代码的可读性。在大多数情况下,这只是出于习惯,但有时您需要在代码中使用分号来消除可能的歧义。安全(和一致)总比后悔好。
下面是一个例子,你建议在JavaScript中的每个语句后使用分号吗?
// define a function
var fn = function () {
//...
} // semicolon missing at this line
// then execute some code inside a closure
(function () {
//...
})();
将被解释为:
var fn = function () {
//...
}(function () {
//...
})();
此外,分号允许适当地打包/缩小Javascript。否则,所有的声明将被搅成一团乱麻。
JavaScript需要分号。但是它有自动分号插入功能。
大多数JavaScript程序员都比ASI聪明,他们更喜欢使用分号。
这种习惯来自于恐惧。害怕"破碎"的js压缩器(我曾经在使用没有var
语句的遗留js的Plone压缩器时遇到过一些问题),害怕可能破碎的浏览器实现,等等。那么,为什么不在所有地方使用;
并避免所有这些缺陷呢?
这种方法的问题(总是使用分号而不做进一步的解释)是,你没有试图理解你为什么要这样做,你只是因为有人说你这样做,恕我直言,这也可能是有害的。过去坏掉的压缩器现在修好了,你不断地插入分号……改掉习惯很难。我们只是继续做事情,因为"我们总是这样做"。
许多新的JavaScript程序员被建议只用分号无处不在,并期望如果他们不是故意使用的分号插入规则,它们可以安全地忽略是否存在这是整个语言特性。事实并非如此,因为上面描述的限制生成,特别是return语句。当意识到限制生产的问题时,程序员然后可能会对换行符过于警惕,甚至在什么时候都避免使用它们会增加清晰度。最好是熟悉所有的ASI的规则,以便能够读取任何代码,无论它如何
这是关于这个主题的一个很好的资源和引用的来源。
那么哪种风格更好呢?在某种程度上,客观地说"更好"的选择,在我看来最小分号/逗号优先的样式稍微好一点,因为从根本上说,它更容易扫描,因为它鼓励让程序员更好地理解他们所使用的语言。
…第二个引用来自一篇可选的文章,反对总是使用分号。也是一本很棒的读物。
是否使用分号在很大程度上是一个选择问题。然而,在javascript中,与许多其他语言不同,不使用它们可能会导致意想不到的结果。例如,
return
{'foo':'bar'};
由于javascript的自动分号插入,将不返回任何值。
关于这种编码方式的起源可能仍然是一个有争议的问题,但它可能来自于在if条件中区分1和许多语句的能力,这在大多数语言中都很常见。还有,人们可能会混淆JavaScript的对象文本
的语法首先,你有一个语句if:
if (someNumber == 2)
doSomething();
else
doSomethingElse();
然后,您有多语句if(不需要分号):
if (someNumber == 3) {
doThisFirst();
doThisSecond();
} else
doSomethingElse();
这种语法也可能与JavaScript的对象文字混淆,后者确实需要半彩色:
var SomeObjectLiteral = {
property: 2,
doSomething: function() {
}
};
基本上,分号在Javascript中用于确定命令或定义的结束位置非常重要。大括号对于确定这些命令的块同样重要。但是,你可以有任意多的分号。如果有疑问,请使用分号,但如果有人叫你不需要分号,请做好准备:)
C语言在语句末尾使用分号,也使用大括号。
PHP在行末使用分号,这就是为什么我通常在javascript中使用分号。
分号标志着JS语句的结束,但是我不把分号放在右括号之后,只放在大括号内的语句之后,并且总是在返回语句之后。
在你的例子中,我认为没有必要。
在分号的帮助下可以在函数内编写多条语句;分号,用于分隔语句。很容易理解。
除了代码的可读性之外,当您实际尝试最小化代码时,分号的使用也会出现。缩小后,如果代码中没有分号,javascript引擎可能无法知道哪个语句在哪里结束,因为代码中将不再有任何新行。
- JavaScript-为什么我可以在数组中设置键
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- JavaScript:为什么Addy's观察者模式
- JavaScript - 为什么这个闭包不保存参数
- JavaScript:为什么不't将背景变化发送给用户's选择(简单)
- Javascript-为什么我的JQueryAJAX请求失败
- JavaScript:为什么这个循环的优化使它变慢了
- JavaScript:为什么 array.push() 附加两个对象而不是一个对象
- JavaScript - 为什么这不起作用?我看不出有什么区别
- Javascript——为什么一个document.getElementById()有效,而另一个无效
- Javascript-为什么不是't此setTimeout函数正在工作
- HTML/JavaScript:为什么不'我的纽扣坏了
- JavaScript:为什么这个代码不;t工作
- Javascript:为什么复制值而不更改
- 阻止表单提交 javascript 为什么有一个明显的错误语句返回 true
- JavaScript-为什么这段代码不起作用
- Javascript:为什么我把“;()“;在console.log中调用变量时在变量后面
- Javascript:为什么要使用indexOf()来匹配字符串中的值
- JavaScript:为什么boolean总是返回true
- JavaScript-为什么当我向表中添加新列时,它会说“;未定义的“;在额外的细胞中