在 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);
}