传递参数数组而不改变它

时间:2015-03-18 13:01:41

标签: javascript

我试图找到将一组参数传递给函数的最佳方法,但不会改变(或寻址)执行上下文。

我有这个:

some_args = ["world"];
in.some.namespace.hello.apply(this, some_args);

不幸的是,这会将hello的执行上下文更改为全局对象。

使用hello作为执行上下文调用in.some.namespace的最简单方法是什么?

书写

in.some.namespace.hello.apply(in.some.namespace, some_args]

看起来详细而且错误。

3 个答案:

答案 0 :(得分:3)

  

书写

 in.some.namespace.hello.apply(in.some.namespace.hello, some_args]
     

看起来详细而且错误。

(在下面我将in.更改为n.,因为您无法声明名为in的变量,而我想提供一些直播例子。)

三个选项,其中没有一个真正令人兴奋:; - )

  1. 使用with,尽管其代表不良且与严格模式不兼容

  2. 自己写一个实用功能

  3. 使用一次性变量,不要介意一些非常时髦的语法

  4. 使用with

    with (n.some) {
        namespace.hello.apply(namespace, some_args);
    }
    

    略微少重复,虽然还有一些,你必须使用with,这在严格模式下是不允许的。

    效用函数

    示例效用函数:

    
    
    function callWith(obj, name, args) {
      return obj[name].apply(obj, args);
    }
    var n = {
      some: {
        namespace: {
          hello: function(a, b, c) {
            alert(this.name + " says " + [a, b, c].join(", "));
          },
          name: "namespace"
        }
      }
    };
    
    callWith(n.some.namespace, "hello", [1, 2, 3]);
    
    
    

    (如果您使用重命名方法的minifier,请小心这样做,因为它可能不会更新字符串。)

    一次性变量和非常时髦的语法

    我想明确表示我不推荐这个,只是将其标记为一个选项:如果你有一个变量,你为此目的而四处闲逛,你可以这样做:

    (o = n.some.namespace, o.hello.apply(o, [1, 2, 3]));
    

    E.g:

    
    
    var o;
    var n = {
      some: {
        namespace: {
          hello: function(a, b, c) {
            alert(this.name + " says " + [a, b, c].join(", "));
          },
          name: "namespace"
        }
      }
    };
    
    (o = n.some.namespace, o.hello.apply(o, [1, 2, 3]));
    
    
    

    可以说这是逗号运算符的 abusage 。至少。 : - )

答案 1 :(得分:0)

如果您正在寻找创建函数委托的方法:

function $createDelegate(instance, method)
{
    return function (someArgs) { return method.apply(instance, someArgs); } 
}

用法:

var delegate = $createDelegate(in.some.namespace, in.some.namespace.hello);
...
delegate(someArgs);

例如,这是将回调传递给事件处理程序而不会丢失上下文的非常有用的方法。

答案 2 :(得分:0)

如果问题只是编写尽可能短的代码行,请考虑在变量中缓存什么是多余的(对于perfs来说它也更好,因为它减少了查找次数):

var n = in.some.namespace;
n.hello.apply(n, some_args);