Function Coffeescript函数中的可选参数

Function Coffeescript函数中的可选参数,function,coffeescript,Function,Coffeescript,我一直在看带有签名的函数 一些参数arg1、arg2、[可选]cb 这是怎么做到的?jQuery一直都在做这类事情: .on(事件[,选择器][,数据],处理程序(事件对象)) 它的工作方式是,内部可选参数和最终参数具有不同的类型,因此该函数可以使用手工解析(或类似但较松散的检查,如各种)来确定如何调用它。如果在可能的参数列表中有多个相同类型的东西,那么您应该在混合中抛出一个长度检查,以尝试找出意图是什么 例如: f = () -> args = Array::slice.appl

我一直在看带有签名的函数

一些参数arg1、arg2、[可选]cb


这是怎么做到的?

jQuery一直都在做这类事情:

.on(事件[,选择器][,数据],处理程序(事件对象))

它的工作方式是,内部可选参数和最终参数具有不同的类型,因此该函数可以使用手工解析(或类似但较松散的检查,如各种)来确定如何调用它。如果在可能的参数列表中有多个相同类型的东西,那么您应该在混合中抛出一个长度检查,以尝试找出意图是什么

例如:

f = () ->
    args = Array::slice.apply(arguments)
    if(typeof args[0] == 'function')
        args[0]()
    else
        console.log("#{args[0]} is not a function")

f(1, 2, 3)
f(-> console.log('pancakes'))
演示:

一个更具CoffeeScript风格的版本将使用
..
而不是直接处理
参数

f = (args...) ->
    if(typeof args[0] == 'function')
        args[0]()
    else
        console.log("#{args[0]} is not a function")

演示:

您在哪里看到的?通常,可选参数在最后。在本例中,哪些参数应该是可选的,哪些参数应该是强制性的?aww的有趣用法splat@Alexis至于为什么使用这个参数形式,把一个匿名函数放在参数列表中间是非常丑陋和视觉上混淆的。(是的
setTimeout
setInterval
这样做,但这些签名(IMO)是错误的,会导致大量看起来很糟糕的代码)。