在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#slicearguments方法应用于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 --^-------^
    

    10-07 19:53
    查看更多