4

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

我读过这个错误,称为“没有足够的参数”。是标准的吗?它为什么存在?

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

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

4

4 回答 4

7

我读过这个错误,称为“没有足够的参数”。

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

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

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

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

于 2013-09-17T18:14:57.183 回答
2

参数在 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 方法就是这种情况,如果您在谷歌上搜索该异常,您会发现这些方法。

于 2013-09-17T18:10:18.967 回答
1

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

但是,这并没有严格执行。在 Chrome 中,可以不提供参数,也可以只提供一个参数addEventListener,不会报错。但是,Firefox 更严格,会吐出“没有足够的参数”错误。

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

于 2013-09-17T18:08:04.877 回答
0

只有当您尝试使用错误类型的参数(例如String代替Function)调用标准 DOM 操作方法时,Firefox 才会显示“没有足够的参数”。

纯 JavaScript 没有这样的概念,如果使用自己的函数,你不会得到这个错误。

于 2013-09-17T18:10:49.227 回答