JavaScript函数可以接受最大数量的参数吗?

Gla*_*eep 64 javascript

我知道JavaScript函数可以接受"任意"数量的参数.

function f(){};
f(1,2,3,4 /*...*/);
Run Code Online (Sandbox Code Playgroud)

但我想知道实际上有多少"任何"可以限制?

比如说,让我说一百万个参数f().那会有用吗?或者翻译龙骨?

我猜测最大值是(a)特定于实现或(b)(2^32)-1,因为arguments对象是类似数组的.

我没有在语言规范中看到这一点,但我可能没有连接一些点.

p.s*_*w.g 80

虽然没有具体限制规范中理论最大数量的论点(正如的回答所 指出的那样).当然有实际限制.这些限制完全取决于实现,很可能也取决于您如何调用该函数.


我创造了这个小提琴作为实验.

function testArgs() {
    console.log(arguments.length);
}

var argLen = 0;
for (var i = 1; i < 32; i++) {
    argLen = (argLen << 1) + 1;
    testArgs.apply(null, new Array(argLen));
}
Run Code Online (Sandbox Code Playgroud)

这是我的结果:

  • Chrome 33.0.1750.154 m:最后一次成功的测试是65535个参数.之后它失败了:

    未捕获RangeError:超出最大调用堆栈大小

  • Firefox 27.0.1:最后一次成功的测试是262143个参数.之后它失败了:

    RangeError:传递给Function.prototype.apply的arguments数组太大

  • Internet Explorer 11:最后一次成功的测试是131071个参数.之后它失败了:

    RangeError:SCRIPT28:堆栈空间不足

  • Opera 12.17:最后一次成功的测试是1048576个参数.之后它失败了:

    错误:Function.prototype.apply:argArray太大了

当然,这里可能还有其他因素可能会有不同的结果.


这是一个使用的替代小提琴eval.同样,您可能会得到不同的结果.

  • Chrome 33.0.1750.154 m:最后一次成功的测试是32767个参数.之后它失败了:

    Uncaught SyntaxError:函数调用中的参数太多(仅允许32766)

    这一点特别有趣,因为Chrome本身似乎对实际允许的参数数量感到困惑.

  • Firefox 27.0.1:最后一次成功的测试是32767个参数.之后它失败了:

    脚本太大了

  • Internet Explorer 11:最后一次成功的测试是32767个参数.之后它失败了:

    RangeError:SCRIPT7:内存不足

  • Opera 12.17:最后一次成功的测试是4194303个参数.之后它失败了:

    内存不足; 脚本已终止.

  • 您的示例正在测试“.apply()”的最大值,超过问题中所示传递的函数参数。它们不一定相同。[这是一个演示](http://jsfiddle.net/DZn2D/2/),我使用“Function”构造函数从字符串创建了一个函数。该函数调用“testArgs()”函数,并向其传递 100,000 个参数。仅创建该函数就会失败,并出现“语法错误:函数参数太多” (2认同)

Pau*_*per 21

ECMAScript 5.1,第8.8部分

List类型用于解释新表达式,函数调用以及需要简单值列表的其他算法中参数列表(见11.2.4)的评估....这些序列可以是任意长度.

所以标准没有限制.当然,如果您的代码在现实世界中运行,而不是在标准区域运行,那么显然存在一些限制(例如,宇宙中的粒子数量).

有两种方法可以将参数传递给函数.

  • "从字面上看": f(a, b, c)
  • 使用apply(): f.apply(null, [a, b, c])

对于大型参数列表,后一种方式是更现实的方案.

转到此JSFiddle以查看当前浏览器的每个限制.

我自己试了几个浏览器:

           | apply() | literal
 ----------------------------
Chrome 14  | 131155  |  32767
Chrome 35  | 126213  |  65535
Firefox 30 | 500001  |  65535
IE 9       | 254335  |  65533
IE 10      | 253667  |  65533
IE 11      | 252447  |  65533
Opera 22   | 126063  |  65535
Safari 4   | 524215  | 524205
Safari 7   |  65537  | 522159
Run Code Online (Sandbox Code Playgroud)

我在不同的机器上看到了许多这些数字的差异,所以我相信除了浏览器(OS?)之外还有其他因素在起作用.


这是一个真正的问题,而不是一些琐事.一个现实世界的例子:

Google Closure Library定义了以下功能.

goog.crypt.byteArrayToString = function(array) {
  return String.fromCharCode.apply(null, array);
};
Run Code Online (Sandbox Code Playgroud)

仅当字符串的长度在可以传递的参数数量的浏览器限制内时,这才起作用Function.prototype.apply.

该功能后来被修补,使功能显着更复杂.


仅供参考,2012年3月提交了一个开放的Webkit问题,讨论了参数限制.


the*_*eye 6

根据ECMA Script 5.1标准规范List,

List类型用于解释新表达式,函数调用以及需要简单值列表的其他算法中的参数列表(见11.2.4)的评估.List类型的值只是有序的值序列.这些序列可以是任何长度.

因此,标准对参数的数量没有任何限制,仅受内存的限制.