只管 Javascript
有相似 C
的句法作风,然则它并不强迫在代码中运用分号,所以分号能够被省略。Javascript
并非一个缺乏分号的言语,实际上,它须要分号来剖析代码。因而当 Javascript
剖析器碰到缺乏分号而致使毛病时会自动插进去分号。
var foo = function() {
} // parse error, semicolon expected
test()
此时 Javascript
会自动插进去分号,剖析器将再次尝试。
var foo = function() {
}; // no error, parser continues
test()
自动的分号插进去被认为是 Javascript
设想的缺点之一,因为它能转变代码的行动。
事情道理
下面的代码没有分号,因而 Javascript
剖析器将会本身推断在哪些地方插进去分号。
(function(window, undefined) {
function test(options) {
log('testing!')
(options.list || []).forEach(function(i) {
})
options.value.test(
'long string to pass here',
'and another long string to pass'
)
return
{
foo: function() {}
}
}
window.test = test
})(window)
(function(window) {
window.someLibrary = {}
})(window)
下面是剖析器自行猜测后的效果:
(function(window, undefined) {
function test(options) {
// Not inserted, lines got merged
log('testing!')(options.list || []).forEach(function(i) {
}); // <- inserted
options.value.test(
'long string to pass here',
'and another long string to pass'
); // <- inserted
return; // <- inserted, breaks the return statement
{ // treated as a block
// a label and a single expression statement
foo: function() {}
}; // <- inserted
}
window.test = test; // <- inserted
// The lines got merged again
})(window)(function(window) {
window.someLibrary = {}; // <- inserted
})(window); //<- inserted
很明显,剖析器插进去分号后已转变了代码底本的行动。
前置小括号
在有前置小括号的情况时,剖析器将不会自动插进去分号 。
log('testing!')
(options.list || []).forEach(function(i) {})
代码将被剖析器转换为一行:
log('testing!')(options.list || []).forEach(function(i) {})
总结
基于以上研讨,强烈发起在誊写 Javascript
代码的时刻不要省略分号,同时也发起大括号应当与对应的表达式处于统一行,纵然 if else
语句只要一句也只管不要省略大括号。这不仅将保证代码团体的一致性,也将有效地防止 Javascript
剖析器对代码行动的毛病转变。
关于是不是省略 Javascript
分号,@barretlee 有篇博文写的很好,尤其是个中的一些例子举得很有代表性:
JavaScript Garden
接下来一章节引见 delete
操作符,因为之前我本身已研讨过 delete
相干机制 – 《Javascript – Delete 机制》。因而我不盘算再反复总结一篇博文。
参考
http://bonsaiden.github.io/JavaScript-Garden/#core.semicolon