создать копию уже сделанной функции с новыми параметрами? - PullRequest
2 голосов
/ 16 мая 2019

У меня есть функция 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 голосов
/ 16 мая 2019

Понятия не имею ... может ли JS создать функцию из функции.

Чтобы ответить на эту часть вашего вопроса, да, Javascript может создать функцию из функции.Любая функция может возвращать другую функцию, и типичные способы сделать это - создать функцию factory или использовать функцию curry для создания новых функций:

Factory

Функция, которая возвращает другую функцию.Из-за 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

Curry

Функция curry - это идея взять базовую функцию, которая принимает несколько параметров, и «запекать» один из параметров для более легкого повторного использования:

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
0 голосов
/ 16 мая 2019

Вы можете попробовать использовать bind 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)();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...