1

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

some_fn arg1, arg2, [optional], cb

这是怎么做到的?

4

1 回答 1

2

jQuery 一直在做这种事情,on例如

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

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

例如:

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 的版本将使用...而不是直接处理arguments

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

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

于 2013-06-13T19:01:48.217 回答