在 JavaScript 中检测是否使用正确数量的参数调用函数的最佳方法
Best way to detect if a function was called with the correct number of arguments in JavaScript
根据我的理解,函数重载在 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);
正如 luisenrike 所指出的,代理是解决此问题的好方法。
对于所有代理新手(像我),我想补充一点,您仍然需要在调用处理程序后执行函数。
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);
}
根据我的理解,函数重载在 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);
正如 luisenrike 所指出的,代理是解决此问题的好方法。
对于所有代理新手(像我),我想补充一点,您仍然需要在调用处理程序后执行函数。
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);
}