0

我刚开始使用 Coffeescript 并运行“CoffeeScript 编程”中介绍的示例。

在 while 循环部分,我很好奇为什么必须按如下所述声明对 times 函数的调用。

times = (number_of_times, callback) ->
    index = 0
    while index++ < number_of_times
        callback(index)
    return null

times 5, (index) ->
    console.log index

我在阅读代码时有点挣扎,当我尝试过时:

times (5, (index)) ->
   console.log index

它返回一个错误。你能提供一些帮助理解这段代码吗?

4

1 回答 1

1

标准函数定义的结构如下:

name = (arg, ...) ->
    body

times所以关于你的定义没什么好说的。因此,让我们看看您的电话times

times 5, (index) ->
    console.log index

这部分:

(index) ->
    console.log index

只是另一个函数定义,但这个是匿名的。我们可以使用命名函数重写您的调用以帮助澄清事情:

f = (index) -> console.log index
times 5, f

我们可以填写可选的括号来真正拼写出来:

f = (index) -> console.log(index)
times(5, f)

一旦所有的东西都被分解了,你应该看到5and (index)in:

times 5, (index) ->
   console.log index

彼此无关,因此将它们分组在括号中:

times (5, (index)) ->
   console.log index

没有意义。如果您想在该times调用中添加括号以阐明结构(这在回调函数较长时非常有用),您需要知道两件事:

  1. 函数名称和参数周围的左括号之间没有空格。如果有空格,CoffeeScript 会认为您正在使用括号对参数列表中的内容进行分组。
  2. 括号需要包围整个参数列表,其中包括回调函数的主体。

给它,你会写:

times(5, (index) ->
   console.log index
)

也许:

times(5, (index) -> console.log(index))

Withconsole.log是一个非本地函数,您甚至可以:

times(5, console.log)

但这会给你TypeError一些浏览器,所以不要走那么远。

于 2013-03-17T17:52:04.510 回答