我一直在看到带有签名的函数
some_fn arg1, arg2, [optional], cb
这是怎么做到的?
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/