当我在parens之前调用一个带空格的函数时,它会出现一个错误的说法,
sum = (a, b) ->
a+b
console.log (sum (1, 2))
错误:意外,
console.log(sum(1,2))
它指向1到2之间的逗号
为什么奇怪的行为?
答案 0 :(得分:3)
在CoffeeScript中,您可以通过两种方式编写函数调用:
foo(bar) # with parens
foo bar # without parens
由于sum
和(1, 2)
之间有空格,因此您正在进行sum
传递(1, 2)
作为第一个参数的无括号功能调用,相当于:
bar = (1, 2)
sum bar
问题是(1, 2)
不是有效的CoffeeScript表达式。要传递两个参数,您必须使用以下任一项:
sum(1, 2)
sum 1, 2
答案 1 :(得分:1)
圆括号在CoffeeScript中用于各种目的;与此相关的目的是:
函数调用的括号通常是可选的,所以你可以这样说:
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表达式。
经验法则:如果您希望(或需要)使用括号来表示函数调用,则不要在函数名和左括号之间放置任何空格。