创建一个新函数,该函数接受另一个函数的默认参数(Javascript)

时间:2015-01-24 04:33:03

标签: javascript

我目前正在尝试创建一个defaultArguments函数,该函数接受一个函数和一些设置为默认值的参数。我正在考虑解决这个特定问题的步骤是:

  1. 解析函数以获取其可能是什么的参数。
  2. 遍历提取的每个参数,并将具有输入参数的参数替换为其各自的值。
  3. 现在,我正在考虑做的是在输入' func'中添加其他默认参数。我试着:

    1. 查找如何将字符串作为参数输入到现有函数中。但是,该函数只是将参数字符串作为字符串读取。
    2. 使用JavaScript .apply方法。但是,我不会总是拥有所有输入值。
    3. 这是我到目前为止编写的代码。

      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;
      }
      

0 个答案:

没有答案