1

目的是构建一个包装器,以提供在各种脚本主机上调用具有可变数量的本机函数的一致方法 - 以便脚本可以在浏览器以及 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 之前)引擎上执行。

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

4

2 回答 2

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.
  }
}
于 2010-03-18T19:33:42.340 回答
-1

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

于 2012-04-19T20:08:14.367 回答