我目前正在尝试创建一个defaultArguments函数,该函数接受一个函数和一些设置为默认值的参数。我正在考虑解决这个特定问题的步骤是:
现在,我正在考虑做的是在输入' func'中添加其他默认参数。我试着:
这是我到目前为止编写的代码。
function defaultArguments(func, params) {
var reg = /\(([\s\S]*?)\)/;
var extractVar = reg.exec(func);
if (extractVar) {
var arguments = extractVar[1].split(',');
}
for (i = 0; i < arguments.length; i++) {
if (params[arguments[i]]) {
arguments[i] = params[arguments[i]];
}
}
}
例如,如果我有一个功能
function add(a,b) { return a+b; };
我会使用defaultArguments函数
var add_ = defaultArguments(add,{b:9});
console.log(add_(10) === 19); // b is defaulted to 9
console.log(add_(10,7) === 17); // b is given so use given value
console.log(add_()); // NaN
如果我不正确地解决这个问题,我会喜欢一些关于如何解决这个问题以及不同方法的提示。感谢您阅读本文的时间,我希望看到您的回复!
更新:
所以我能够为这个问题提出一个粗略的解决方案。我想知道我是否正确处理了问题,以及是否对我的代码进行了任何改进。在研究了很多之后,我知道我不应该使用eval(),但我不知道如何解决这个问题。我愿意接受建议。提前谢谢!
function defaultArguments(func, params) {
var stringed = func.toString();
var inputs = stringed.match(/\(.+\)/)[0].replace("(", "").replace(")", "").split(",")
for (i = 0; i < inputs.length; i++) {
inputs[i] = ""+inputs[i]+" = "+inputs[i]+" || "+params[inputs[i]]+";"
}
for (i = 0; i < inputs.length; i ++) {
stringed = stringed.replace("{", "{ "+inputs[i]+"")
}
var newFunc = "var restoreFunc = " + stringed;
eval(newFunc);
return restoreFunc;
}