我尝试通过传递函数名称并使用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
的上下文有关?
答案 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]
。
有两种解决方案,具体取决于您希望如何解决问题:
如果您想以这种方式继续调用您的方法:
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);
}
如果要在函数中继续使用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找到它