@Alex_87

Функция в качестве параметра?

Всем привет! Прошу помочь разобраться нюансах. Есть не понимание, что здесь происходит:

Задача
Необходимо реализовать функцию flip, которая меняет местами аргументы переданной функции

Пример её работы:

const sub = (a, b) => a - b;
const reverseSub = flip(sub);
sub(5, 3); // 2
reverseSub(5, 3); // -2


Реализация функции flip:

const flip(f) => (a, b) => f(b, a);

Вопрос:
Не совсем понятно, что происходит после передачи функции в параметр. Ведь мы не просто аргумент в виде числа передаём, а целую функцию. Выходит, в аргументах flip находится(если мы говорим об этом примере.
flip((a, b) => a - b) => (a, b) => f(b, a);

Как это потом всё работает? Объясните, пожалуйста!
  • Вопрос задан
  • 3377 просмотров
Пригласить эксперта
Ответы на вопрос 2
twobomb
@twobomb
function sub(a,b){
	return a -b;	
}
function flip(func){
		return function(){
    	return func.apply(null, Array.from(arguments).reverse());
    }
}

alert(flip(sub)(10,5));//-5
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Функция в JS – это тоже объект. Её можно назначить переменной, передать аргументом в другую функцию, вернуть как результат работы другой функции.

// исходное определение:
const flip(f) => (a, b) => f(b, a);

// можно развернуть:
function flip(sourceFunction) {
  return function(a, b) {
    return sourceFunction(b, a);
  }
}
Функция flip() принимает аргументом функцию. И возвращает новую функцию.

Создаваемая-возвращаемая функция вызывает исходную с аргументами наоборот.

можно разжевать
function flip(f) {
  // ура, нам дали какую-то исходную функцию!
  var sourceFunction = f; // для красоты запишем её в свою переменную
  // можно и вызвать её при желании:  sourceFunction(4, 5)
  // но пока не будем. Рано. Ждём.

  // сделаем новую, хакерскую функцию
  var hackerFunc = function(a, b) {
    // тут пусть всю работу делает старая функция
    var result = sourceFunction(a, b);

    // стоп. Не то. Надо же аргументы местами поменять
    var result = sourceFunction(b, a);

    // хакерский результат
    return result;
  } // конец определения хакер-функции
  
  // вернём теперь хакер-функцию:
  return hackerFunc;
}
Вот как flip(f) возващает новую хитрую хакерскую функцию.

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы