JavaScript 中是否存在没有足够的参数这样的事情?为什么
Is there such a thing as not enough arguments in JavaScript? Why?
在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没有这样的概念,如果使用自己的函数,则不会得到此错误。
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 为什么不'我们在javascript中使用函数参数的数据类型
- 为什么jQuery文件的函数中有两个参数,但只接收一个参数
- 为什么可以't我跳过函数签名中的参数分配
- 为什么ES6 Fiddle没有't覆盖命名参数
- JavaScript - 为什么这个闭包不保存参数
- 为什么在创建作用域时将参数传递给anon函数
- 为什么我传递给函数的参数未定义
- ExternalInterface为我提供了在使用多个参数时停止脚本的选项.为什么?
- 为什么要将Array.prototype.slice.call与参数一起使用
- 为什么我不能在 node.js(浏览器化)的 require() 函数中使用变量作为参数
- 为什么参数对象没有在控制台中显示它的方法
- 为什么忽略以下函数的参数
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 为什么我需要使用函数作为参数,并且可以'不要只使用它返回的值
- 为什么 JSON.parse 无法检测参数是否已采用 JSON 格式
- Jsonresult在我的Ajax调用中使用参数失败.为什么会发生这种事
- 使用函数作为函数的参数:为什么要使用匿名函数
- 读取ReadableStream并指定大小参数:为什么state.highWaterMark总是被传递到_read()作
- 这两个参数为什么在jQuery源码中为