Как реализовать применить в моем коде (без изменения функций вызова)

1

Поэтому я пытаюсь понять, как правильно использовать приложение с объектами и аргументами, вместо использования операторов if else.

Мой текущий код:

var log = function(call, name) {
  return function(a, b, c) {
    if (c === undefined) {
      console.log(name + "(" + a + b + ")" + "=" + call(a, b));
    } else {
      console.log(name + "(" + a + b + c + ")" + "=" + call(a, b, c));
    }
  }
};

//Includes two call functions

EDIT: более читаемый

  • 0
    console.log(name + "(" + [].join.call(arguments, ",") + ")=>" + callback.apply(null, arguments));
  • 0
    Вы можете использовать Function.name вместо того, чтобы передавать имя функции. Вы также можете использовать синтаксис распространения (или apply в вашем случае) для передачи аргументов.
Теги:

1 ответ

0

Если вы хотите использовать apply, то вы просто вызовите apply с первым параметром как null а второй параметр - в список аргументов:

console.log(name + "(" + a + "," + b + "," + c + ")" + "=>" + callback.apply(null, [a, b, c]));

var wrapLog = function(callback, name) {
  return function(a, b, c) {
    console.log(name + "(" + a + "," + b + "," + c + ")" + "=>" + callback.apply(null, [a, b, c]));
  }
};

var area = function(x, y) { //don't change this function
  return x * y;
};
var logArea = wrapLog(area, "area");



logArea(5, 3); // area(5, 3) => 15
logArea(3, 2); // area(3, 2) => 6

var volume = function(x, y, z) { //don't change this function
  return x * y * z;
};
var logVolume = wrapLog(volume, "volume");

logVolume(5, 3, 2); // volume(5, 3, 2) => 30
logVolume(3, 2, 4); // volume(3, 2, 4) => 24

Но вы можете рассмотреть возможность преобразования аргументов в функцию, возвращаемую wrapLog в массив в самих параметрах для минимального синтаксического шума:

return function(...args) {
  console.log('${name}(${args}) => ${callback.apply(null, args)}');
}

var wrapLog = function(callback, name) {
  return function(...args) {
    console.log('${name}(${args}) => ${callback.apply(null, args)}');
  }
};

var area = function(x, y) { //don't change this function
  return x * y;
};
var logArea = wrapLog(area, "area");



logArea(5, 3); // area(5, 3) => 15
logArea(3, 2); // area(3, 2) => 6

var volume = function(x, y, z) { //don't change this function
  return x * y * z;
};
var logVolume = wrapLog(volume, "volume");

logVolume(5, 3, 2); // volume(5, 3, 2) => 30
logVolume(3, 2, 4); // volume(3, 2, 4) => 24
  • 0
    Если я допустил ошибку, может кто-нибудь объяснить? Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню