1

假设我想设置一堆等于 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)) {
    // ...
}

这与使用&&or ||or=对换行符分组表达式有何比较?即,这也总是有效吗?

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+)中最标准的方式。

4

2 回答 2

2

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

将发生分号插入的示例:

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 关键字和表达式的开头之间才不允许换行。在表达式内部,这不是问题。

于 2014-10-20T15:12:42.080 回答
1

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

是的。虽然没有必要:

这与使用&&or ||or=对换行符分组表达式有何比较?

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

只有在没有分号的续行无效时才会出现ASI 。请参阅JavaScript 的自动分号插入 (ASI) 的规则是什么?详情。

于 2014-10-20T15:22:07.017 回答