【问题标题】:How to create a variadic (with variable length argument list) function wrapper in JavaScript如何在 JavaScript 中创建可变参数(具有可变长度参数列表)函数包装器
【发布时间】:2010-03-18 19:18:59
【问题描述】:

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

  1. eval()方法:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
  2. switch()方法:

    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]);
            }
        }
    
  3. apply()方法:

    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    

你问他们怎么了?

  1. 好吧,我们是否应该深入研究为什么eval() 是邪恶的?还有所有的字符串连接......不是被标记为“优雅”的解决方案。

  2. 人们永远无法知道n 的最大值,因此无法知道要准备多少cases。这也会使剧本过长,违背神圣的DRY原则。

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

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

【问题讨论】:

  • 目前使用的 Javascript 引擎不支持.apply()
  • 你指的是哪些原生函数?我想不出任何因环境而异的论点
  • 没有一个平台具有如此过时的 Javascript 实现,不会引起您的担忧。在这样的平台上,您可能最不担心这个问题。
  • 小型企业通常买不起现代硬件和软件 - 仍然有数以万计 - 如果不是更多 - 使用古老的浏览器运行 win9x 系统并使用长期不受支持的预打包 Windows 脚本主机版本
  • @meouw - 您在大多数浏览器中都有 window.alert(),但在 Windows Script Host 中没有 window.alert() - 要改用 WScript.echo() 方法。

标签: javascript function wrapper javascript-framework variable-length


【解决方案1】:

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

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

【讨论】:

  • 那么,没有第四种方法吗?好吧,我会和这个一起去的。谢谢!
【解决方案2】:

就像自动的“this”变量一样,有一个“arguments”变量保存所有传入函数的参数。见javascript variadic

【讨论】:

  • 问题是关于创建可变参数 wrapper 函数,该函数将其所有参数传递给另一个函数。 提示:下次尝试先阅读整个问题。另外,你不能在外部覆盖另一个函数的arguments对象。
最近更新 更多