如果我调用的JS参数的参数多于定义接受的参数,会发生什么?

wwa*_*waw 12 javascript arguments function attachevent

我想知道常规的全家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);
Run Code Online (Sandbox Code Playgroud)

Pri*_*orn 16

JavaScript没有固定参数列表的概念.对于您自己的函数,您始终可以根据需要指定任意数量的参数,并根据需要传入任何您想要的类型.

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

你询问它取决于什么:

我们来看看ECMA-262

第15节关于内置(不要与主机混淆)的功能

除非在特定函数的描述中另有规定,否则如果给定本节中描述的函数或构造函数的参数少于指定函数所需的参数,则函数或构造函数的行为应完全像给出足够的附加参数一样这种论点是未定义的价值.

好的.如果我传入的参数少于所需的参数,则取决于函数本身的规范(向下滚动第15部分以查找每个内置函数的规范).

除非在特定函数的描述中另有说明,否则如果给定本节中描述的函数或构造函数的参数多于指定允许的函数,则额外参数将由调用计算,然后由函数忽略.但是,实现可以定义与此类参数相关的实现特定行为,只要该行为不是抛出仅基于额外参数的存在而预测的TypeError异常.

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

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


Gal*_*bra 6

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

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

\r\n
\r\n
function singleArg(x) {\n  console.log(arguments);\n}\n\nsingleArg(1, 2); // Called with 2 arguments\nsingleArg();     // Called with 0 arguments\n\n// Results in an error, as \'arguments\' isn\'t defined for arrow functions\n((arg) => console.log(arguments))(1);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

    \n
  1. 文档中指出,这arguments并不完全Array
  2. \n
\n
\n

\xe2\x80\x9cArray-like\xe2\x80\x9d 表示参数具有 length 属性和从零索引的属性,但它没有 Array 的内置方法,例如 forEach() 和 map() 。

\n
\n

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

\n

\r\n
\r\n
(function singleArg(x) {\n  console.log(arguments); // This line works\n  arguments.forEach(x => console.log(x)); // This causes an error\n})(1, 2);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

    \n
  1. 当调用一个参数少于其签名的函数时,它们被分配undefined
  2. \n
\n

\r\n
\r\n
(function twoArgs(a, b) {\n  console.log(`a: ${a}\\nb: ${b}`);\n})(1);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


Dio*_*der 5

不会受伤.你甚至可以调用一个参数少于所需参数的函数,只要函数代码没有几个未定义的值即可.