3 回答

TA贡献1765条经验 获得超5个赞
虽然没有具体限制规范中理论最大数量的论点(正如她的回答所 指出的那样)。当然有实际限制。这些限制完全取决于实现,很可能也取决于您如何调用该函数。
我创造了这个小提琴作为实验。
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));}
这是我的结果:
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个参数。之后它失败了:
内存不足; 脚本已终止。

TA贡献1795条经验 获得超7个赞
List类型用于解释新表达式,函数调用以及需要简单值列表的其他算法中的参数列表(参见11.2.4)的评估。List类型的值只是有序的值序列。这些序列可以是任何长度。
因此,标准对参数的数量没有任何限制,仅受内存的限制。
添加回答
举报