理解coffeescript语法

理解coffeescript语法,coffeescript,Coffeescript,我是CoffeeScript的新手,我很难理解它的一些语法 例如,在此函数调用中: e('') .color('rgb(255,0,0)') .attr( x: 20, y: 100, w: 10, h: 100 ) 我希望这可以编译JS代码,将带有键x、y、w、h的对象传递到attr方法。但这段代码实际上编译为: e('').color('rgb(255,0,0)').attr({ x: 20 }, {

我是CoffeeScript的新手,我很难理解它的一些语法

例如,在此函数调用中:

e('')
    .color('rgb(255,0,0)')
    .attr( x: 20,
           y: 100,
           w: 10,
           h: 100 )
我希望这可以编译JS代码,将带有键x、y、w、h的对象传递到
attr
方法。但这段代码实际上编译为:

e('').color('rgb(255,0,0)').attr({
  x: 20
}, {
  y: 100,
  w: 10,
  h: 100
});
它将两个对象传递给
attr
,第一个是使用键
x
,第二个是使用键
y
w
h
。我很难理解为什么x和其他键是分开的,但是其他键却没有分开

因为我想传递
attr
方法一个对象,所以我尝试了以下方法:

e('')
    .color('rgb(255,0,0)')
    .attr({x: 20,
           y: 100,
           w: 10,
           h: 100})
但这给了我
y:100
所在行中的编译错误:
错误:第4行上的解析错误:意外的{
。奇怪的是,第4行中没有
{
。我还尝试删除
attr
中的paren,但仍然得到相同的错误

我可以用这个来解决它:

e('')
    .color('rgb(255,0,0)')
    .attr(
           x: 20,
           y: 100,
           w: 10,
           h: 100)
如果我删除
.attr(
)之后的换行符,那么我在第一个示例中得到的代码是相同的,这不是我想要的

现在我想知道我是否误解了CoffeeScript语法中的一些要点,或者其中有一些非常奇怪的东西。或者我在CoffeeScript中发现了一个bug?有什么想法吗


我正在使用CoffeeScript 1.3.1

显而易见的解决方案是将对象放在一行上,如
.attr({x:20,y:100,w:10,h:100})
(虽然还没有测试过,但我不明白为什么它不起作用)


虽然有时不能使用括号,但我更喜欢在函数调用中使用括号,因为我觉得它更可读。

显而易见的解决方案是将对象放在一行上,如
.attr({x:20,y:100,w:10,h:100})
(虽然没有测试过,但我不明白为什么它不起作用)


虽然有时不能使用括号,但我更喜欢在函数调用中使用括号,因为我发现它更具可读性。

在coffeescript中,空格非常重要。您不能只将内容排列在您认为应该排列的位置。请尝试以下操作:

e('')
  .color('rgb(255,0,0)')
  .attr(
    x: 20
    y: 100
    w: 10
    h: 100
  )
编辑:如果希望x与方法调用在同一行上,只需正确缩进:

e('')
    .color('rgb(255,0,0)')
    .attr(x: 20,
    y: 100,
    w: 10,
    h: 100)

在coffeescript中,空格是很重要的。你不能把东西排在你认为应该放在哪里的地方。试试这样:

e('')
  .color('rgb(255,0,0)')
  .attr(
    x: 20
    y: 100
    w: 10
    h: 100
  )
编辑:如果希望x与方法调用在同一行上,只需正确缩进:

e('')
    .color('rgb(255,0,0)')
    .attr(x: 20,
    y: 100,
    w: 10,
    h: 100)

这就是你要找的:

e('')
  .color('rgb(255,0,0)')
  .attr
    x:20
    y:100
    w:10
    h:100
其汇编目的是:

e('').color('rgb(255,0,0)').attr({
  x: 20,
  y: 100,
  w: 10,
  h: 100
});

记住,CoffeeScript是简单的,避免使用大括号和逗号…

这就是你想要的:

e('')
  .color('rgb(255,0,0)')
  .attr
    x:20
    y:100
    w:10
    h:100
其汇编目的是:

e('').color('rgb(255,0,0)').attr({
  x: 20,
  y: 100,
  w: 10,
  h: 100
});

请记住,CoffeeScript非常简单,避免使用大括号和逗号…

当然,这是可行的。我已经有了一个可用的代码,但我想知道为什么编译器会将错误告知我的第二个示例,如果我有几十个元素,那么我如何传递一个对象,所以我必须分成几行。当然,这是可行的。我已经有了一个w正在编写代码,但我想知道为什么编译器会将错误传递给我的第二个示例,如果我有几十个元素,那么我如何传递一个对象,所以我必须将其拆分为行。嗯,所以删除对象文本中的逗号是可行的。谢谢。我仍在寻找编译器错误的答案,以及为什么在我的第一个示例中只有x与其他键分开示例。我认为它被分离的原因是因为第一个参数与方法调用放在同一行。换行符使编译器假设第二组变量。这种假设适用于具有此类签名
methodName(param1、param2、objOrCallback)的方法
x被分隔的原因是因为有重要的空格。你缩进错了。@Sandro,我不确定。
字符在参数语法中无效。它不应该被解释为参数。确保它有效,它只意味着你正在创建一个对象。嗯,所以删除对象文本中的逗号是有效的。谢谢。我仍然在考虑我正在寻找编译器错误的答案,以及为什么在我的第一个示例中只有x与其他键分开。我相信它分开的原因是因为第一个参数与方法调用放在同一行。换行符使编译器假设第二组变量。这种假设适用于具有这种类型的f签名
methodName(param1、param2、objOrCallback)
x被分隔的原因是因为有重要的空格。你缩进错了。@Sandro,我不确定。
字符在参数语法中无效。它不应该被解释为参数。确保它有效,它只意味着你正在创建一个对象。除非避免大括号和逗号会降低可读性。t虽然这里不是这样,但很容易跨越界限并加入黑暗面,这从来都不是一件好事。我的观点是,CoffeeScript有点像“Python for JS”。除非避免使用大括号和逗号会降低可读性。虽然这里不是这样,但很容易跨越界限并加入黑暗面,这从来都不是一件好事我的观点是CoffeeScript有点像“Python for JS”。