Coffeescript:在parens之前调用带空格的函数

时间:2013-06-07 13:45:22

标签: function coffeescript parentheses

当我在parens之前调用一个带空格的函数时,它会出现一个错误的说法,

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

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

它指向1到2之间的逗号

为什么奇怪的行为?

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中用于各种目的;与此相关的目的是:

  1. 在表达式中分组。
  2. 函数调用。
  3. 函数调用的括号通常是可选的,所以你可以这样说:

    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))
    

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

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