Rog*_*ier 4 javascript whitespace comments
我总是假设 JavaScript 源代码中的所有空白(空格、制表符、换行符)都是“相等的”,即它们对于分隔语言元素(例如标识符、关键字、运算符等)都是有效的。
然而,我注意到换行符与空格或制表符之间有一个奇怪的区别。甚至在评论里面!
这工作正常:(函数定义和函数调用之间的换行符,但没有分号)
var bla = function() { alert('hello') }
bla();
Run Code Online (Sandbox Code Playgroud)
这也有效:(结束 } 字符和 bla() 函数调用之间的分号)
var bla = function() { alert('hello') };bla();
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用:(无论只有一个空格或制表符,还是多个,或没有,都没有区别)
var bla = function() { alert('hello') } bla();
Run Code Online (Sandbox Code Playgroud)
事情变得更奇怪了。
这也不起作用:(由包含空格、制表符和分号的注释分隔)
var bla = function() { alert('hello') } /* ; */ bla();
Run Code Online (Sandbox Code Playgroud)
但这确实:(包含换行符的注释)
var bla = function() { alert('hello') }/*
*/bla();
Run Code Online (Sandbox Code Playgroud)
现场 jsfiddle 演示:
这是 JavaScript 中的错误,还是我遗漏了什么?
这并不是由于空白行为不当,而是由于 Javascript 的“ASI”功能:“自动分号插入”。
这是 Javascript 语言首次引入时就包含的功能。基本上,交易是这样的:
核心 JS 语言要求每个语句都以分号结束。
然而,由于该语言是针对网页设计者(当时不被认为是程序员)的,因此解析器被修改为在开发人员忘记包含分号时更加宽松。如果解析器认为缺少分号,但存在换行符,则会假设分号是有意的。
坦率地说,这在语言设计中是一个非常糟糕的决定:它会导致许多已知的怪癖,这些怪癖可能会导致非常难以调试的问题。特别是,您需要非常小心地对待return返回多行对象结构的语句,但正如您的问题所示,它还有很多其他方法可以让您陷入困境。
这里要学习的教训很简单:始终在 JS 语句之间包含分号,即使它们看起来是可选的。
如果您确实对 ASI 主题感兴趣,可以在这里阅读有关 ASI 的更多信息,作为 Javascript 程序员,了解这一点很重要。但一般来说,如果您只包含分号,您基本上可以忘记它。
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |