【问题标题】:Do parentheses prevent semicolon insertion?括号会阻止分号插入吗?
【发布时间】:2014-12-15 15:07:38
【问题描述】:

假设我想将一堆变量设置为 null(并且不想使用数组/循环结构),或者我只想跨多行编写一个大型布尔表达式。在这种情况下,未闭合的括号会阻止分号插入吗?例如

some_variable = another_variable = yet_another_variable = (
    oh_look_a_parenthesis_above_me = hey_heres_another_variable) = (
    and_for_some_reason_another = last_one) = null;

或者

if(test_for_some_complex_expr && another_test || (
    but_maybe_this_one && or_this_one)) {
    // ...
}

这与使用 &&||= 在换行符上对表达式进行分组相比如何?即,这也总是有效吗?

some_variable = another_variable = 
    a_variable_after_a_line_break = and_one_more;

while(test_for_an_expr && another_test || 
    (an_expr_here && and_an_expr_here)) {
    // ...
}

我正在寻找在所有浏览器(包括 IE6+)中最标准的方式。

【问题讨论】:

  • AFAIK,JavaScript 不关心空格(让您的担忧变得毫无意义)。
  • @Brad:在某些情况下,JavaScript 实际上确实关心换行符。
  • @JacquesB:只有引用的字符串和一些逻辑情况,但我更多地指的是延长条件表达式。

标签: javascript line-breaks automatic-semicolon-insertion


【解决方案1】:

分号插入仅在您的代码没有分号时才会发生语法错误。在您的情况下,表达式是完全有效的,因此您不必担心分号插入 - 括号与否。

分号插入的例子:

var a = 1
var b = 2

在上述情况下,在换行符处插入了一个分号,但这只是因为它是语法错误:

var a = 1 var b = 2

但写起来完全有效:

var a = 1; var b = 2

规则变得棘手,因为在 JavaScript 语法中有一些不允许换行的实例。例如,“return”关键字和要返回的值之间不允许换行。所以这是一个语法错误:

return
  17;

但是分号插入“修复”这个错误的方法是像这样插入分号:

return;
  17;

这可能不是作者的本意! 在这种特殊情况下,可以使用括号来防止分号插入:

return (
   17);

因为只有在 return 关键字和表达式的开头之间才不允许换行。在表达式内部这不是问题。

【讨论】:

  • 这非常有见地。谢谢!
【解决方案2】:

在这种情况下,未闭合的括号会阻止分号插入吗?

是的。虽然没必要:

这与使用 &&||= 在换行符上对表达式进行分组相比如何?

完全一样。它们是需要第二部分的表达式,因此 ASI 不能 - 绝不能 - 在不使结果无效的情况下生效。

ASI 将在没有分号的续行是无效时发生。详情请见What are the rules for JavaScript's automatic semicolon insertion (ASI)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2012-04-10
    相关资源
    最近更新 更多