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

JavaScript apply()将所有参数作为一个数组传递,javascript,Javascript,我试图通过传递函数名并使用apply()在控件中执行外部JS函数 我正在使用堆栈上找到的解决方案 函数MyFunction: function MyFunction(e, data){ // e <- this is an array [e, data] // data <- this is undefined } 函数MyFunction(e,数据){ //e var args = Array.prototype.slice.call(arguments, 2);

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

我正在使用堆栈上找到的解决方案

函数MyFunction

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

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

因此有两种方法:

(一)

executeFunctionByName(函数名,窗口,[e,数据]);

(二)

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

之后

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

因此有两种方法:

(一)

executeFunctionByName(函数名,窗口,[e,数据]);

(二)

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

之后

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

因此有两种方法:

(一)

executeFunctionByName(函数名,窗口,[e,数据]);

(二)

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

之后

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

因此有两种方法:

(一)

executeFunctionByName(函数名,窗口,[e,数据]);

(二)

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


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

当您调用
var args=Array.prototype.slice.call(arguments,2);
时,它本身返回一个包含另一个数组的数组

您正在传递
[[e,data]]
以应用,而不是
[e,data]

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

  • 如果要继续以这种方式调用方法:

    executeFunctionByName(functionName, window, [e, data]);
    
    function executeFunctionByName(functionName, context, args) {
      var namespaces = functionName.split(".");
      // ....
      return context[func].apply(context, args);
    }
    
    这样,您就完全不需要
    参数
    上的
    数组.prototype.slice
    。您有一个可预测的参数数量,它总是3个。只需这样编写您的函数:

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

    executeFunctionByName(functionName, window, e, data);
    

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

    当您调用
    var args=Array.prototype.slice.call(arguments,2);
    时,它本身返回一个包含另一个数组的数组

    您正在传递
    [[e,data]]
    以应用,而不是
    [e,data]

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

  • 如果要继续以这种方式调用方法:

    executeFunctionByName(functionName, window, [e, data]);
    
    function executeFunctionByName(functionName, context, args) {
      var namespaces = functionName.split(".");
      // ....
      return context[func].apply(context, args);
    }
    
    这样,您就完全不需要
    参数
    上的
    数组.prototype.slice
    。您有一个可预测的参数数量,它总是3个。只需这样编写您的函数:

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

    executeFunctionByName(functionName, window, e, data);
    

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

    当您调用
    var args=Array.prototype.slice.call(arguments,2);
    时,它本身返回一个包含另一个数组的数组

    您正在传递
    [[e,data]]
    以应用,而不是
    [e,data]

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

  • 如果要继续以这种方式调用方法:

    executeFunctionByName(functionName, window, [e, data]);
    
    function executeFunctionByName(functionName, context, args) {
      var namespaces = functionName.split(".");
      // ....
      return context[func].apply(context, args);
    }
    
    这样,您就完全不需要
    参数
    上的
    数组.prototype.slice
    。您有一个可预测的参数数量,它总是3个。只需这样编写您的函数:

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

    executeFunctionByName(functionName, window, e, data);
    

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

    当您调用
    var args=Array.prototype.slice.call(arguments,2);
    时,它本身返回一个包含另一个数组的数组

    您正在传递
    [[e,data]]
    以应用,而不是
    [e,data]

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

  • 如果要继续以这种方式调用方法:

    executeFunctionByName(functionName, window, [e, data]);
    
    function executeFunctionByName(functionName, context, args) {
      var namespaces = functionName.split(".");
      // ....
      return context[func].apply(context, args);
    }
    
    这样,您就完全不需要
    参数
    上的
    数组.prototype.slice
    。您有一个可预测的参数数量,它总是3个。只需这样编写您的函数:

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

    executeFunctionByName(functionName, window, e, data);
    

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

    我会这样做:

    function MyFunction(data){
       //Some action with your data
    }
    
    并称之为:

    executeFunctionByName(functionName, window, [data]);
    

    其中数据是一些数据数组。我认为Mozilla页面上的文档对其进行了更清楚的解释,可以在

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

    我会这样做:

    function MyFunction(data){
       //Some action with your data
    }
    
    并称之为:

    executeFunctionByName(functionName, window, [data]);
    

    其中数据是一些数据数组。我认为Mozilla页面上的文档对其进行了更清楚的解释,可以在

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

    我会这样做:

    function MyFunction(data){
       //Some action with your data
    }
    
    并称之为:

    executeFunctionByName(functionName, window, [data]);
    

    其中数据是一些数据数组。我认为Mozilla页面上的文档对其进行了更清楚的解释,可以在

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

    我会这样做:

    function MyFunction(data){
       //Some action with your data
    }
    
    并称之为:

    executeFunctionByName(functionName, window, [data]);
    
    其中数据是一些数据数组。我认为Mozilla页面上的文档对其解释得更清楚,可以在

    executeFunctionByName(functionName,window,e,data);
    的文档中找到