javascript函数的语法(空白)是否会影响结果?

时间:2012-08-15 15:14:39

标签: javascript debugging parsing

在编写一个javascript函数来评估多变量条件时,我遇到了似乎是Javascript中的解析器错误。如果我遗忘了某些内容,或者这是否适当,请告诉我。

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

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

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

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

  1. 多行表达式 - 失败
  2. 单行表达 - 工作
  3. 将表达包装在paretheses中 - 工作
  4. 将多行表达式设置为变量,然后返回变量 - 工作
  5. 参见工作示例:http://jsfiddle.net/drzaus/38DgX/

    有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:7)

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

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

有更多细节(以及规范中的引用):Trouble understanding semicolon insertion

答案 1 :(得分:6)

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

答案 2 :(得分:2)

啊哈 - 相关链接: JavaScript Whitespace Syntax Error

似乎解析器在return之后看到换行符并自动将其处理为分号。在它工作的情况下,有一个parethesis指示解析器它实际上是一个多行子句,或者它在一行(从而否定autoinsert),或者在变量的情况下它是由解析器处理不同。