我知道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个参数.之后它失败了:
内存不足; 脚本已终止.
Pau*_*per 21
List类型用于解释新表达式,函数调用以及需要简单值列表的其他算法中参数列表(见11.2.4)的评估....这些序列可以是任意长度.
所以标准没有限制.当然,如果您的代码在现实世界中运行,而不是在标准区域运行,那么显然存在一些限制(例如,宇宙中的粒子数量).
有两种方法可以将参数传递给函数.
f(a, b, c)
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问题,讨论了参数限制.
List类型用于解释新表达式,函数调用以及需要简单值列表的其他算法中的参数列表(见11.2.4)的评估.List类型的值只是有序的值序列.这些序列可以是任何长度.
因此,标准对参数的数量没有任何限制,仅受内存的限制.
归档时间: |
|
查看次数: |
22244 次 |
最近记录: |