4

在编写一个 javascript 函数来评估多变量条件时,我遇到了 Javascript 中的解析器错误。如果我忘记了什么,或者这是适当的行为,请告诉我。

在我的函数中,我返回了AND几个变量的结果,如下所示:

return
// a comment, for kicks
a1 && a2
&&
b1 && b2
&&
// another comment
c1 && c2
&&
d1 && d2
;

但是,即使所有这些变量都具有显式值true,该函数也会返回undefined而不是预期的true

我尝试了几种返回此表达式的变体,我发现:

  1. 多行表达式——失败
  2. 单行表达式——有效
  3. 用括号括起来的表达式——有效
  4. 将多行表达式设置为变量,然后返回变量--有效

请参阅工作示例:http: //jsfiddle.net/drzaus/38DgX/

谁能解释为什么会这样?

4

3 回答 3

7

您遇到的是 Javascript 中称为“分号插入”的奇怪行为。长话短说,当行尾可以解释为语句的结尾而不会引入语法错误时,Javascript 会这样做。语句后的换行符return符合条件 - 为了防止这种情况发生,您可以将返回的值括在括号中,如下所示:

return (
  a1 && a2
  ...
  d1 && d2
);

在以下位置有更多详细信息(以及规范中的引用):Trouble understands semicolon injection

于 2012-08-15T15:19:20.277 回答
6

这是正确的行为。放入return;一个函数会导致它返回undefined。在您的示例中,后的换行符return使解析器认为这是语句的结尾,因此它返回undefined.

于 2012-08-15T15:17:52.677 回答
2

啊哈——相关链接万岁: JavaScript 空白语法错误

解析器似乎看到了一个换行符,return并自动将其视为分号。在它起作用的情况下,有一个括号向解析器表明它实际上是一个多行子句,或者它在单行上(因此否定自动插入),或者在变量的情况下它被解析器以不同的方式处理。

于 2012-08-15T15:18:11.543 回答