Лучший способ определить, была ли вызвана функция с правильным количеством аргументов в JavaScript

1

К моему пониманию, перегрузка функций на самом деле не вещь в JS. Вот почему это не вызовет ошибку

function f(first, second){}

f(); // no error
f(1) // still no error
f(1,2) // no error and correct

Я хотел бы проверить каждую функцию, если я назвал ее с правильным количеством аргументов. Способ сделать это - добавить что-то подобное к каждой функции

if(function.length !== arguments.length){
/*error detected*/
}

Недостатком является то, что я должен был бы добавить это во все функции.

Есть лучший способ сделать это?

Теги:
error-handling
arguments
overloading
function-call

2 ответа

2
Лучший ответ

Вы можете создать прокси-сервер, вам все равно придется немного модифицировать свой код, но он выполняет эту работу.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

function getArgsProxy(fn) {

  var handler = {
    apply: function(target, thisArg, argumentsList) {
      if (target.length != argumentsList.length) {
        throw new Error('Error message');
      }
      return target.apply(thisArg, argumentsList);
    }
  };

  return new Proxy(fn, handler);

}


/* USAGE */

var f = getArgsProxy(function(first, second) {});

f(); // error
f(1) // error
f(1, 2) // no error and correct

// or

function f(first, second) {}
var $f = getArgsProxy(f);

$f(); // error
$f(1); // error
$f(1, 2);
  • 0
    это не совсем лучше, чем прямая проверка внутри функции.
  • 0
    это потому, что вам не нужно кодировать логику внутри каждой функции
Показать ещё 5 комментариев
0

Как отметил Луисенрике, прокси - хороший способ решить эту проблему.

Для всех новых для прокси (например, я), я хотел бы добавить, что вы все равно должны выполнить функцию после вызова обработчика.

function getArgsProxy(fn) {

    var handler = {
        apply: function(target, thisArg, argumentsList) {
            if (target.length != argumentsList.length) {
                console.warn('wrong number of arguments!');
                console.trace();
            } else {
                // execute the function fn
                // use return, in case your function has a return value
                return fn.apply(thisArg, argumentsList);
            }
        }
    };
    return new Proxy(fn, handler);
}

Ещё вопросы

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