1

其目的是构建一个包装以提供一种在各种脚本宿主上调用具有可变参数的本机函数的一致方法 - 以便可以执行该脚本在浏览器中以及在Windows Script Host或其他脚本引擎中。
我知道3种方法,每种方法都有其自身的缺点。如何在JavaScript中创建一个可变参数(带有可变长度参数列表)函数包装

  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准备。这也会使剧本成为巨大的比例,并且违背神圣的原则。

  3. 该脚本可能会在不支持apply()方法的较旧(JavaScript 1.3/ECMA-262-3)引擎上执行。

现在问题部分:有没有其他解决方案呢?

+2

今天使用的Javascript引擎不支持'.apply()'? – SLaks 2010-03-18 19:22:34

+0

你的意思是哪个本地功能?我想不出任何根据环境而有不同参数的 – meouw 2010-03-18 19:25:51

+2

没有这样一个过时的Javascript实现的平台将足以让你担心。很有可能在这样的平台上这个问题将成为你最担心的问题。 – Pointy 2010-03-18 19:26:59

回答

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. 
    } 
} 
+0

那么,没有第四种方法?那么,我会继续这样做。谢谢! – 2010-03-18 21:18:25

-1

就像自动“这个”变量,也就是持有传递给函数的所有参数的“论据”变量。见javascript variadic

+1

问题是关于创建一个variadic ** wrapper **函数,它将所有参数传递给另一个函数。 *提示:下次尝试阅读整个问题。*另外,您不能从外部覆盖另一个函数的'arguments'对象。 – 2012-04-19 23:02:28

相关问题