我一直以为JavaScript源代码中的所有空格(空格,制表符,换行符)都是“相等”的,即它们对于分隔标识符,关键字,运算符等语言元素都是有效的。
但是,我注意到换行符与空格或制表符之间的奇怪区别。甚至里面的评论!
可以正常工作:(在函数定义和函数调用之间换行,但不能使用分号)
var bla = function() { alert('hello') }
bla();
这也适用:(在结束字符}和bla()函数调用之间使用分号)
var bla = function() { alert('hello') };bla();
但是,这是行不通的:(只有一个空格或一个制表符,还是多个或没有,都没有区别)
var bla = function() { alert('hello') } bla();
它变得更加陌生。
这也不起作用:(由包含空格,制表符和分号的注释分隔)
var bla = function() { alert('hello') } /* ; */ bla();
但是这样做:(包含换行符的注释)
var bla = function() { alert('hello') }/*
*/bla();
现场jsfiddle演示:
这是JavaScript中的错误,还是我缺少某些东西?
这不只是空白行为不当,还在于Javascript的“ ASI”功能:“自动分号插入”。
首次引入时,此功能已包含在Java语言中。基本上,交易是这样的:
JS核心语言要求每个语句都以分号结尾。
但是,由于该语言是针对Web设计师(当时不被认为是程序员)的,因此如果开发人员忘记使用分号,则将解析器修改为宽松的。如果解析器认为缺少分号,但存在换行符,则会假设使用分号。
坦白地说,这在语言的设计中确实是一个非常糟糕的决定:它导致了许多已知的怪癖,这些怪癖可能导致难以调试的问题。特别是,return
对于返回多行对象结构的语句,您需要非常小心,但是,正如您的问题所表明的那样,它还有许多其他方法可以使您脱颖而出。
这里要学习的课程很简单:始终在JS语句之间包括分号,即使它们看起来是可选的也是如此。
如果您真的对该主题感兴趣,可以在这里阅读有关ASI的更多信息,作为Javascript程序员,了解这一点很重要。但是总的来说,如果仅包括分号,则大多数情况下都可以忽略它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句