如何在JavaScript中创建可变(具有可变长度参数列表)函数包装器

如何在JavaScript中创建可变(具有可变长度参数列表)函数包装器,javascript,function,wrapper,javascript-framework,variable-length,Javascript,Function,Wrapper,Javascript Framework,Variable Length,其目的是构建一个包装器,以提供在各种脚本主机上使用变量arity调用本机函数的一致方法,从而使脚本可以在浏览器以及Windows脚本主机或其他脚本引擎中执行。 我知道有三种方法,每种方法都有自己的缺点 eval()方法: function wrapper () { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']';

其目的是构建一个包装器,以提供在各种脚本主机上使用变量arity调用本机函数的一致方法,从而使脚本可以在浏览器以及Windows脚本主机或其他脚本引擎中执行。
我知道有三种方法,每种方法都有自己的缺点

  • eval()
    方法:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
    function wrapper () {
        switch (arguments.lenght) {
            case 0:
                return [native_function] (arguments[0]);
                break;
            case 1:
                return [native_function] (arguments[0], arguments[1]);
                break;
            ...
            case n:
                return [native_function] (arguments[0], arguments[1], ... arguments[n]);
            }
        }
    
    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    
  • apply()
    方法:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
    function wrapper () {
        switch (arguments.lenght) {
            case 0:
                return [native_function] (arguments[0]);
                break;
            case 1:
                return [native_function] (arguments[0], arguments[1]);
                break;
            ...
            case n:
                return [native_function] (arguments[0], arguments[1], ... arguments[n]);
            }
        }
    
    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    
  • 你问他们怎么了

  • 那么,我们是否应该深入探究
    eval()
    是邪恶的所有原因?还有所有的字符串连接。。。这不是一个被贴上“优雅”标签的解决方案

  • 人们永远不可能知道最大的
    n
    ,也不可能知道需要准备多少
    案例。这也会将剧本扩展到巨大的规模,违背神圣干燥原则

  • 该脚本可以在不支持
    apply()
    方法的较旧(JavaScript 1.3/ECMA-262-3之前)引擎上执行

  • 现在问题部分:还有其他解决方案吗?

    只需使用
    apply()
    。对于过时的执行引擎,只需这样做

    if ( 'undefined' == typeof Function.prototype.apply )
    {
      Function.prototype.apply = function( context, args )
      {
        // whatever hacky way you want to implement it - i guess eval.
      }
    }
    

    就像自动的“this”变量一样,有一个“arguments”变量保存传递给函数的所有参数。请参阅。

    今天使用的哪个Javascript引擎不支持
    .apply()
    ?您指的是哪些本机函数?我想不出有哪一个平台会根据环境的不同而有不同的论点。没有哪一个平台具有如此过时的Javascript实现会引起您足够的兴趣。在这样的平台上,这个问题很可能是你最不担心的。小企业通常负担不起现代的硬件和软件——现在仍然有成千上万——如果不是更多的话——使用古老的浏览器和长期不受支持的预包Windows脚本主机运行win9x系统versions@meouw-您有
    window.alert()
    在大多数浏览器中,但在Windows脚本主机中没有
    window.alert()
    WScript.echo()方法将被替代。那么,没有第四种方法了吗?那好吧,我就这么说。谢谢问题是如何创建一个可变包装函数,将其所有参数传递给另一个函数。提示:下次试着先阅读整个问题。此外,您不能从外部覆盖另一个函数的
    参数
    对象。