gpt4 book ai didi

javascript - JavaScript 源代码中的换行符或空格/制表符有区别吗? (甚至在评论中!?)

转载 作者:行者123 更新时间:2023-11-30 12:54:54 24 4
gpt4 key购买 nike

我一直假设 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”特性:“自动分号插入”。

这是 Javascript 语言最初引入时就包含的一项功能。基本上,交易是这样的:

核心 JS 语言要求每个语句都以分号结束。

但是,由于该语言是针对网页设计师(当时不被认为是程序员)的,因此如果开发人员忘记包含分号,解析器将被修改为宽松。如果解析器认为缺少分号,但有换行符,它会假设分号是有意的。

坦率地说,这是语言设计中的一个非常非常糟糕的决定:它导致了一些已知的怪癖,这些怪癖可能导致很难调试的问题。特别是,对于返回多行对象结构的 return 语句,您需要非常非常小心,但是正如您的问题所示,还有很多其他方法可以让您脱颖而出。

这里要吸取的教训很简单:始终在 JS 语句之间包含分号,即使它们看起来是可选的

您可以 read more about ASI here如果您真的对该主题感兴趣,作为 Javascript 程序员,了解这一点很重要。但一般来说,如果您只包含分号,您几乎可以忽略它。

关于javascript - JavaScript 源代码中的换行符或空格/制表符有区别吗? (甚至在评论中!?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19561673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com