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

111
11 сентября 2021, 12:30

Какую функцию выполняет func(), то есть в чем смысл использования этой функции там.

function sum(x, y){ 
    return x + y; 
} 
  
function subtract(x, y){ 
    return x - y; 
} 
  
function operation(x, y, func){ 
   
    var result = func(x, y); 
    console.log(result); 
} 
  
console.log("Sum"); 
operation(10, 6, sum);  // 16 
  
console.log("Subtract"); 
operation(10, 6, subtract); // 4

Answer 1

Если вкратце: потому что так удобнее

Давайте разберем общую ситуацию: нужно отсортировать массив. У нас есть функция sort, которая принимает массив и сортирует его, а еще нам нужен признак, по которому нужно отсортировать элементы, пусть это будет цена:

// Псевдокод
function sort(array) {
  // Реализация какой-то сортировки: быстрая, пузырьковая - неважно
  // Важен вот этот момент:
  if (признак по которому а больше b) {
    // Ставим a первее b
  } else {
    // Наоборот
  }
}

И вот у нас есть функция сортировки по цене. Красивая, супербыстрая и эффективная. Только вот вдруг нам понадобилось в другом месте сортировать по дате. Что же делать? Снова писать ту же самую функцию сортировки, только сравнивать даты, а не цену? Если подумать, то различие будет только в одном месте:

  if (признак по которому а больше b) {
    // Ставим a первее b
  } else {
    // Наоборот
  }

Тут-то нам и помогает вспомогательная функция. Что если вынести этот момент во внешнюю функцию, а остальную сортировку сделать общей? Тогда получится примерно так

function sortFn(a, b) {
  if (признак по которому а больше b) {
    // Ставим a первее b
  } else {
    // Наоборот
  }
}
function(array, fn) {
  // Где-то в коде
  sortFn(a, b);
}

Теперь у нас есть одна общая функция сортировки, меняется только признаки, по которым мы сортируем, и мы можем описывать их отдельными маленькими функциями, каждый раз не дублируя большую функцию сортировки.

Так же работаю forEach, map, filter - функции, где есть какая-то общая часть, но уникальные условия для каждого конкретного случая.

Что касается вашего случая, он очень простой, чтобы увидеть профит. Но давайте представим, что у нас в функции operation происходит еще много чего

function operation(x, y, func) {
  // Считаем попугаев, валидируем, взламываем пентагон.
  // много строчек кода...
  // Готово
  var result = func(x, y);
  console.log(result);
}

Без третьего параметра, нам бы пришлось делать все доп операции прямо в sum, substract и вообще в любой операции, что является дублированием кода и плохо масштабируется, а так, вся общая логика в одном месте, меняется лишь главная часть, которая зависит от конкретных желаний.

Как бы было без третьего параметра:

function sumOpeartion(x, y){ 
    const result =  x + y; 
    console.log(result); 
} 
  
function subtractOperation(x, y){ 
    const result = x - y; 
    console.log(result); 
} 
  
console.log("Sum"); 
sumOpeartion(10, 6);  // 16 
  
console.log("Subtract"); 
subtractOperation(10, 6); // 4

Answer 2

func в operation - лишь переменная, в которую вы передаёте другую функцию, когда вызываете operation. Как мы видим - помимо operation есть ещё 2 функции, и когда вы вызываете operation, вы указываете х, у, а так же название функции (sum либо subtract). Внутри operation указанная функция выполняется при обращении к func()

READ ALSO
Чтение из файла fstream

Чтение из файла fstream

Вот у меня есть задание, знаю что легче через структуру FILE, но задание - сделать с fstreamЗаписываем информацию про студентов: имя, группа, оценки...

115
передавать структуры в функции или вкладывать функции в структуры C++

передавать структуры в функции или вкладывать функции в структуры C++

Всем привет, возникла у меня необходимость в функции для работы с данными из структурыЯ решил сделать функцию частью структуры, у меня сразу...

149
Как настроить Qt для WebAssembly?

Как настроить Qt для WebAssembly?

Первым пунктом новости о выходе Qt 513 является объявление стабильного выпуска Qt for WebAssembly - поддержка исполнения Qt приложений в современных...

258
Ошибка функции sort()

Ошибка функции sort()

В Microsoft Visual Studio Community 2019, V 163

92