JavaScript apply()将所有参数作为一个数组传递

时间:2014-12-30 08:27:24

标签: javascript

我尝试通过传递函数名称并使用apply()来在我的控件中执行外部JS函数。

我正在使用堆栈here

上找到的解决方案
function executeFunctionByName(functionName, context /*, args */) {
    var args = Array.prototype.slice.call(arguments, 2);
    var namespaces = functionName.split(".");
    var func = namespaces.pop();
    for (var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
    }
    return context[func].apply(context, args);
}

功能用法:

var functionName = 'MyFunction';
executeFunctionByName(functionName, window, [e, data]);

功能 MyFunction

function MyFunction(e, data){
    // e <- this is an array [e, data]
    // data <- this is undefined
}

根据documentation apply()应该在函数定义中传递参数,而不是数组。

有没有办法让它按照文档中描述的方式工作?

是否与设置为window的上下文有关?

3 个答案:

答案 0 :(得分:2)

之后

var args = Array.prototype.slice.call(arguments, 2);

console.log(args); // [[e, data]], array in array... got it?

所以有两种方式:

1)

executeFunctionByName(functionName, window, [e, data]);

executeFunctionByName(functionName, window, e, data);

2)

var args = Array.prototype.slice.call(arguments, 2);

var args = arguments[2]; //or name the third input parameter

答案 1 :(得分:1)

apply很好。问题是你有一个双嵌套数组。

当你致电var args = Array.prototype.slice.call(arguments, 2);时,它本身会返回一个包含另一个数组的数组。

您正在通过[[e, data]]申请,而不是[e, data]

有两种解决方案,具体取决于您希望如何解决问题:

  1. 如果您想以这种方式继续调用您的方法:

    executeFunctionByName(functionName, window, [e, data]);
    

    然后您完全不需要Array.prototype.slice arguments。你有一个可预测的参数数量,它总是3 。只需用这种方式编写函数:

    function executeFunctionByName(functionName, context, args) {
      var namespaces = functionName.split(".");
      // ....
      return context[func].apply(context, args);
    }
    
  2. 如果要在函数中继续使用Array.prototype.slice,则需要更改调用函数的方式。你的参数不应该包含在数组中:

    executeFunctionByName(functionName, window, e, data);
    

答案 2 :(得分:0)

在您的示例中,您应该可以使用e或数据调用它,但不能同时使用两者。

我会这样做:

function MyFunction(data){
   //Some action with your data
}

并将其命名为:

executeFunctionByName(functionName, window, [data]);

数据是某些数据的数据。我认为Mozilla页面上的文档更清楚地解释了它,可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply找到它