К моему пониманию, перегрузка функций на самом деле не вещь в 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*/
}
Недостатком является то, что я должен был бы добавить это во все функции.
Есть лучший способ сделать это?
Вы можете создать прокси-сервер, вам все равно придется немного модифицировать свой код, но он выполняет эту работу.
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);
Как отметил Луисенрике, прокси - хороший способ решить эту проблему.
Для всех новых для прокси (например, я), я хотел бы добавить, что вы все равно должны выполнить функцию после вызова обработчика.
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);
}