当bug出现时,为什么括号在coffeescript中有效

why does the bracket works in coffeescript when bugs came

本文关键字:coffeescript 有效 为什么 bug      更新时间:2023-09-26

如果我想得到这样一个从coffeescript:编译的js代码

  var sortableTodos = new Sortables("todo-list", {
constrain: true,
clone: true,
handle: ".todo-content",
onComplete: function(ele){
  sortableTodos.serialize(false, function(element, index){
    todo = Todos.get(element.getProperty("id").replace("todo-", ""));
    todo.save({"order": index});
  });
}
});

我不能像下面这样写咖啡代码:

sortableTodos = new Sortables(
"todo-list"
(
    constrain: true
    handle: '.todo-content'
    onComplete:(ele)->
        sortableTodos.serialize false, (element,index)->
                todo = Todos.get(element.getProperty("id")).replace("todo-","")
                todo.save("order":index)
)   
   )

但以下工作(它在onComplete后加括号)

sortableTodos = new Sortables(
"todo-list"
(
    constrain: true
    handle: '.todo-content'
    onComplete:((ele)->
        sortableTodos.serialize false, (element,index)->
                todo = Todos.get(element.getProperty("id")).replace("todo-","")
                todo.save("order":index)
               )
)   
  )  

我不知道为什么?是虫子吗?

CoffeeScript解析器在跨多行拆分函数参数时有很多怪癖。(请参阅第1135期。)只有在省略括号时,函数的多行参数才允许用于YAML样式的对象。所以当

func
  foo: bar
  x: y

工作(编译以将单个对象传递给func),其他参数通常需要与func位于同一行。或者,您可以在行的末尾使用'转义,就像在JS中一样,使编译器将多行视为一行:

func '
  a  '
  b

对于您的情况,最好的解决方案是将字符串移动到与函数调用相同的行,去掉对象文字周围的括号(如果您喜欢,请使用大括号),并与缩进保持一致:

sortableTodos = new Sortables("todo-list", {
    constrain: true
    handle: '.todo-content'
    onComplete: (ele) ->
        sortableTodos.serialize false, (element,index) ->
            todo = Todos.get(element.getProperty("id")).replace("todo-","")
            todo.save("order":index)
})