3

当我在括号前调用一个带有空格的函数时,它会给出一个错误,说 unepected ,

sum = (a, b) ->
  a+b
console.log (sum (1, 2))

错误:意外,
console.log (sum (1, 2))

它指向 1 和 2 之间的逗号

为什么奇怪的行为?

4

2 回答 2

3

在 CoffeeScript 中,您可以通过两种方式编写函数调用:

foo(bar) # with parens
foo bar  # without parens

由于您在sumand之间有一个空格(1, 2),因此您正在进行作为第一个参数sum传递的无括号函数调用(1, 2),相当于:

bar = (1, 2)
sum bar

问题是这(1, 2)不是一个有效的 CoffeeScript 表达式。要传递两个参数,您必须使用以下任一参数:

sum(1, 2)
sum 1, 2
于 2013-06-07T17:17:04.420 回答
1

括号在 CoffeeScript 中有多种用途;此处相关的目的是:

  1. 在表达式中分组。
  2. 函数调用。

函数调用的括号通常是可选的,因此您可以这样说:

console.log 6, 11

一切都很好。当分组括号和函数调用括号之间存在一些歧义时,就会出现问题。考虑一下:

f = (n) -> 2*n
f (1 + 2) + 3

结果是什么?如果括号用于分组,那么我们有:

x = (1 + 2) + 3 #  6
f x             # 12

但如果括号表示函数调用,那么我们有:

x = 1 + 2 # 3
y = f x   # 6
y + 3     # 9

因此,括号的含义存在一些歧义,表达式的结果取决于如何解决这种歧义。如果函数名和左括号之间有空格:

f (1 + 2) + 3

然后 CoffeeScript 使用括号进行分组,并填写可选的括号,函数调用如下所示:

x = (1 + 2) + 3
f(x)

但是,如果没有任何空间,则将其视为:

x = (1 + 2)
f(x) + 3

因此,如果在左括号之前有一个空格,那么 CoffeeScript 假定它应该填充函数调用的隐含括号;如果没有空格,则括号被视为显式而不是隐式。

现在我们可以看看你的具体情况:

console.log (sum (1, 2))

log和后面的空格sum表示括号用于分组,(1, 2)不是有效的 CoffeeScript 表达式。

经验法则:如果您想(或需要)使用括号来表示函数调用,则不要在函数名称和左括号之间放置任何空格。

于 2013-06-07T14:34:37.603 回答