【问题标题】:Optional arguments in Coffeescript functionsCoffeescript 函数中的可选参数
【发布时间】:2013-06-10 05:57:54
【问题描述】:

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

some_fn arg1, arg2, [optional], cb

这是怎么做到的?

【问题讨论】:

  • 你在哪里见过这个?通常,可选参数放在最后。
  • 在这个例子中,哪些参数应该是可选的,哪些应该是强制性的?

标签: function coffeescript


【解决方案1】:

jQuery 一直在做这种事情,on for example:

.on( events [, selector ] [, data ], handler(eventObject) )

它的工作方式是内部可选参数和最终参数具有不同的类型,因此函数可以使用typeof(或类似但更宽松的检查,如各种is* functions in Underscore)手动解析arguments,以找出它是如何被调用的。如果可能的参数列表中有多个相同类型的东西,那么您将在组合中进行长度检查以尝试找出意图是什么。

例如:

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

演示:http://jsfiddle.net/ambiguous/c6UwC/

更多 CoffeeScript-ish 版本将使用 ... 而不是直接处理 arguments

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

演示:http://jsfiddle.net/ambiguous/gPmJZ/

【讨论】:

  • aww splat 的有趣用法
  • @Alexis:至于为什么使用这种参数形式,将匿名函数放在参数列表的中间是非常丑陋和视觉混乱的(是的 setTimeoutsetInterval 这样做但是这些签名是 (IMO) 错误并导致大量看起来令人讨厌的代码)。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2011-10-09
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多