在Lua中,这样的函数将是有效的:
function FuncCallHack(Func, ...)
return Func(...)
end
有没有办法可以用JavaScript做到这一点?
...
对那些不熟悉Lua的人意味着“所有未索引的参数都以未分组数组的形式”。我已经在JavaScript中尝试过...
,但它似乎无法正常工作,而且由于Google不喜欢搜索特殊字符,因此并没有太大帮助。 最佳答案
JavaScript具有arguments
伪数组和apply
函数;您可以这样做:
function FuncCallHack(Func) {
return Func.apply(this, [].slice.call(arguments, 1));
}
运作方式如下:
arguments
-这是一个伪数组,其中包含调用代码传递给函数的所有参数(包括format参数Func
)。 [].slice.call(arguments, 1)
是一种获取除第一个参数以外的所有参数的数组的方法。 (这是一个常见的习惯用法。它通过使用Array#slice
将arguments
方法应用于Function#call
伪数组来工作(这与下面的Function#apply
非常相似,它只是接受args的传递方式不同。)。可悲的是,arguments
本身并没有必须具有slice
方法,因为它实际上不是数组。 Function#apply
方法(所有JavaScript函数都有它)使用与调用Func
相同的this
值来调用FuncCallHack
,并将除Func
之外的所有参数都传递给它。 您也可以稍微不同地定义它:
function FuncCallHack(Func, args) {
return Func.apply(this, args);
}
...仍然非常易于使用:
FuncCallHack(SomeFunction, [1, 2, 3]);
// Note this is an array --^-------^