如果我有一个功能:
function myfunc(param1, param2, param3) {
// ...
}
我有一个字符串:
var myCall = "myfunc(1, 'abc', 'true')"
有没有办法使用字符串进行函数调用并包含参数?我事先并不知道参数的数量。 我试过了
var func = myCall.substr(0, myCall.indexOf('('));
var args = myCall.substring(myCall.indexOf('(')+1, myCall.length-1);
window[func](args.split(','));
但是只调用带有数组的函数到第一个参数。如何拆分参数并使用未知数量的参数传递它们?
答案 0 :(得分:3)
您可以使用Function
构造函数执行此操作:
function myfunc(param1, param2, param3) {
console.log(param1, param2, param3);
}
var myCall = "myfunc(1, 'abc', 'true')";
// here the 'myfunc' string indicates the name of a parameter that will
// be passed into the function that new Function is creating.
// i.e., we are going to pass in the myfunc function
// when we actually call myCaller
var myCaller = new Function('myfunc', myCall);
myCaller(myfunc);
答案 1 :(得分:0)
您可以使用.replace()
RegExp
再次使用/\(.*/
将.replace()
RegExp
替换除功能名称/^\w+(?=\))|[()]/
以外的所有字符以删除字符串中的函数名称和括号,.match()
与RegExp
/[\w\d]+/g
匹配数字或字符,.map()
表示数组中的数字或字符,Function.prototype.apply()
将数组传递给函数调用
function myfunc(param1, param2, param3) {
console.log(param1, param2, param3)
}
var myCall = "myfunc(1, 'abc', 'true')";
var fn = myCall.replace(/\(.*/, "");
var params = myCall.replace(/^\w+(?=\))|[()]/, "")
.match(/[\w\d]+/g).map(function(param) {
return /\d/.test(param) ? +param : param
});
window[fn].apply(null, params);