25

我想知道常规的全家族 JS 开发人员(我)定义的函数,以及预定义的 DOM 方法。就像如果我尝试attachEvent使用 WHATWG 的签名调用 IE 会发生什么addEventListener?例如,

elem.attachEvent('onbillgates\'mom', function(e){ this.mount(); }, false);

具体来说,请注意false. 即使attachEvent方法的签名只需要两个参数,这会不会出错?

谢谢。

function foo(FirstOf2, SecondOf2) {
  console.log(FirstOf2 + SecondOf2);
}

foo(1, 2, true);
4

5 回答 5

25

JavaScript 没有固定参数列表的概念。对于您自己的函数,您始终可以指定任意数量的参数,并传入任意数量的参数。

对于与本机代码相关的内置函数,它取决于.

你问这取决于什么:

让我们看看ECMA-262

第 15 节关于一般内置(不要与host混淆)函数

除非在特定函数的描述中另有规定,如果本节中描述的函数或构造函数的参数少于指定的函数所需的参数,则函数或构造函数的行为应与已给予足够的附加参数完全相同,每个这样的论点是未定义的值。

好吧。如果我传入的参数比需要的少,这取决于函数本身的规范(向下滚动第 15 节以查找每个内置函数的规范)。

除非在特定函数的描述中另有说明,否则如果此子句中描述的函数或构造函数的参数多于函数指定允许的参数,则调用会评估额外的参数,然后函数将其忽略。但是,实现可以定义与此类参数相关的实现特定行为,只要该行为不是简单地基于额外参数的存在而引发的 TypeError 异常。

传入太多参数永远不应该引发 TypeError。但它仍然可能引发其他错误。同样,这取决于您谈论的功能。

您明确谈论的是 DOM 而不是内置函数。老实说,我找不到规范的相应部分。ECMA 规范比 w3 网站更容易阅读。

于 2012-10-02T16:12:15.563 回答
7

不会伤害。您甚至可以调用参数少于所需参数的函数,只要函数代码可以使用一些未定义的值。

于 2012-10-02T16:23:03.777 回答
4

我遇到了这个重要但古老的问题;我希望与它分享我的实验对后代有益:

  1. 无论函数签名中的参数数量如何,都可以使用该arguments对象来访问函数的参数。
    值得一提的是,这不适用于箭头函数:

function singleArg(x) {
  console.log(arguments);
}

singleArg(1, 2); // Called with 2 arguments
singleArg();     // Called with 0 arguments

// Results in an error, as 'arguments' isn't defined for arrow functions
((arg) => console.log(arguments))(1);

  1. 它在文档中说明arguments完全Array

“类数组”意味着参数具有长度属性和从零开始索引的属性,但它没有像 forEach() 和 map() 这样的 Array 内置方法。

因此,以下代码会导致错误:

(function singleArg(x) {
  console.log(arguments); // This line works
  arguments.forEach(x => console.log(x)); // This causes an error
})(1, 2);

  1. 在调用参数少于其签名的函数时,它们被分配undefined

(function twoArgs(a, b) {
  console.log(`a: ${a}\nb: ${b}`);
})(1);

于 2019-07-24T09:39:16.397 回答
0

试着看看这篇文章,也许看看这个

来自MDN

arguments对象是所有函数中可用的局部变量;arguments作为 Function 的属性不能再使用。

arguments您可以通过使用arguments对象来引用函数内的函数。该对象包含传递给函数的每个参数的条目,第一个条目的索引从 0 开始。

arguments如果您调用的函数 arguments超出了正式声明接受的范围,则可以使用该对象。这种技术对于可以传递可变数量参数的函数很有用。

function myConcat(separator) {
  var result = "";

  // iterate through non-separator arguments
  for (var i = 1; i < arguments.length; i++) {
    result += arguments[i] + separator;
  }

  return result;
}
于 2012-10-02T16:14:25.627 回答
-1

除非您明确处理隐式参数数组,否则我认为它不会搞砸任何事情。你为什么要这样做?

于 2012-10-02T16:09:29.663 回答