创建具有新参数的已完成功能的副本?

时间:2019-05-16 09:54:29

标签: javascript function

我有一个函数freq01(),单击按钮时,我希望function(new)用新参数创建函数freq01()的副本。我不知道从哪里开始,也不知道JS是否可以从函数创建函数。

所有变量均已创建。请指出正确的方向...!

下面的代码用于将选中的单选按钮值保存到数组中。

function freq01(){
  if (document.getElementById("w01").checked){
   incFreq = document.getElementById("w01").value;
  }
  else if (document.getElementById("f01").checked){
   incFreq = document.getElementById("f01").value;
  }
  else if (document.getElementById("m01").checked){
   incFreq = document.getElementById("m01").value;
  }
}

2 个答案:

答案 0 :(得分:0)

  

我不知道... JS是否可以从一个函数创建一个函数。

要回答问题的这一部分,可以,Javascript可以从函数创建函数。任何函数都可以返回另一个函数,通常的方法是创建一个 factory 函数,或使用函数 currying 来创建新函数:

工厂

返回另一个函数的函数。由于Javascript的关闭,您可以设置返回函数可以看到的“私有”变量,但调用函数无法访问:

function addTwoFactory() {
  let a = 2;
  return function(b) {
    return a + b;
  }
}

let f1 = addTwoFactory();
let f2 = addTwoFactory();
console.log(f1(3)); // 5
console.log(f2(3)); // 5

还可以创建可配置的工厂,以创建不同种类的方法:

function makeAdder(a) {
  return function(b) {
    return a + b;
  }
}

let addTwo = adderFactory(2);
let addThree = adderFactory(3);
console.log(addTwo(3)); // 5
console.log(addThree(3)); // 6

咖喱

函数计算是采用具有几个参数的基本函数,并“烘焙”其中一个参数以更轻松地重用的想法:

function adder(a, b) {
  return a + b;
}

function makeAdder(a) {
  return function(b) {
    return adder(a, b);
  }
}

let addTwo = makeAdder(2);
console.log(addTwo(3)); // 5

答案 1 :(得分:-1)

您可以尝试使用绑定https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

    var freq01 = freqBase.bind(null, "w01","f01","m01");
function createNewFunc(i){
  return freqBase.bind(null, "w0"+i,"f0"+i,"m0"+i);
}

function freqBase(a,b,c){
  if (document.getElementById(a).checked){
   incFreq = document.getElementById(a).value;
  }
  else if (document.getElementById(b).checked){
   incFreq = document.getElementById(b).value;
  }
  else if (document.getElementById(c).checked){
   incFreq = document.getElementById(c).value;
  }
}

var func2 = createNewFunc(2);
var func3 = createNewFunc(3);
func2();
func2();
func2();
func3();
func2();

其他想法是只返回新功能

var newf1 = function createNewFunc(i){
  return function(){ return i;}
}

newf1(1)();
newf1(1)();
newf1(1)();

较短的版本可能是:

a = (i)=> ()=> { return i; }

或更易读

const f2=function createNew(i){
   return ()=> { return i; }
};
const res = f2(1)();