JavaScript 中是否存在没有足够的参数这样的事情?为什么

Is there such a thing as not enough arguments in JavaScript? Why?

本文关键字:参数 为什么 是否 存在 JavaScript      更新时间:2023-09-26

在JavaScript中,不将某些参数传递给某些函数是有效的。它们被视为undefined这对于许多函数的逻辑至关重要。

我已经读过这个名为"没有足够的参数"的错误。这是标准的吗?它为什么存在?

function foo(a) {
  // yada yada
}
try {
  foo();
} catch (e) {
  console.log(e.name);
}

^ 这段代码没有在Firefox和Chrome上抛出任何东西。

我已经读过这个名为"没有足够的参数"的错误。

这不是标准的语言级错误;这是 API 级错误。也就是说,JavaScript 通常不关心传递给函数的实际参数数量是否与函数的形式参数匹配。但是,用 JavaScript 编写的特定 API 可能关心参数的数量。

例如,Firefox 的 addEventListener 函数(Firefox DOM API 的一部分)可能会抛出"参数不足"错误,因为 addEventListener 的规范被定义为至少需要两个参数。

您可以使用 arguments 对象测试传递给函数的实际参数数:

function foo(a, b) {
    if(arguments.length < 2) {
        throw TypeError("Not enough arguments; two expected");
    }
    if(arguments.length > 2) {
        throw TypeError("Too many arguments; two expected");
    }
    if(arguments.length > 10) {
        throw TypeError("Way too many arguments; did you even read the docs?");
    }
}

如果希望参数不匹配导致错误,代码必须检测参数数并主动引发错误。此版本的foo抛出一个TypeError,该被卡在您的catch块中。

但是请记住,该错误与foo的正式参数的数量无关。我本可以将其定义为function foo(a,b,c),但仍然通过检查arguments强制执行双参数要求。

争论在 JavaScript 中总是可选的。 但这并不意味着它们对于特定 API 是可选的。考虑:

function foo(a) {
  if (a === undefined) {
    var e = {};
    e.name = "Not enough arguements";
    e.message = "All your base r belong to us.";
    throw e;
  } 
  // yada yada
}
try {
  foo();
} catch (e) {
  console.log(e.name);
}

现在它是必需的参数。 某些默认的 DOM 方法就是这种情况,如果您用谷歌搜索该异常,您会发现这种情况。

程序员定义的 JavaScript 函数具有可变的 arity,并且 arity 不是严格执行的(尽管有办法做到这一点)。但是,本机函数可以强制执行 arity。例如,addEventListener需要两个参数:表示事件的字符串和事件处理程序。如果未提供这两个参数,则可能会收到"参数不足"错误。正如我之前提到的,如果您需要特定数量的参数,您可以自己抛出此错误。

但是,这并没有严格执行。在 Chrome 中,您可以不提供任何参数,也可以只提供一个参数来addEventListener ,并且不会报告任何错误。但是,Firefox 更严格,会吐出"参数不足"错误。

此错误存在的原因是,如果未提供所有参数,则执行函数将没有意义。当然,人们想知道为什么Chrome不吐出错误。

"没有足够的参数"仅在您尝试使用错误类型的参数(例如String而不是Function)调用标准 DOM 操作方法时由 Firefox 显示。

普通的JavaScript没有这样的概念,如果使用自己的函数,则不会得到此错误。