一般代码或许不会涉及最大参数长度和最大栈深度,但某些特殊场合,检测这两个参数还是有必要的。例如:用递归计算斐波那契数列的第n个值,不了解最大栈深度,难免显得肤浅。又例如:将一串charCode转成String,不了解最大参数长度,采用字符串拼接的方式,效率提不上,特别是在串较长的情况下。
以下两个方法分别实现了JavaScript运行环境的 最大函数参数长度检测 和 最大栈深度检测。
不同浏览器的测试结果不同,同一款浏览器在不同机器测试结果不同,甚至某些浏览器连续测试时先后结果会有不同。
function getMaximumSupportedArgumentsLength(){
var args={length:0};
function noop(){}
function test(n){
args.length=n;
try{noop.apply(null,args);}catch(e){return false;}
return true;
}
function getNum(upTo){
if(test(upTo)){
return upTo;
}
var min=1,max=upTo,mid=Math.floor((min+max)*0.5);
while(min<max){
if(test(mid)){
min=mid;
}else{
max=mid;
}
mid=Math.floor((min+max)*0.5);
if(mid==min){
break;
}
}
return min;
}
return getNum(0xFFFFFFFF);
}
function getMaximumCallStackSize(){
var size=0;
function test(){
size++;
test();
}
try{
test();
}catch(e){
return size;
}
}
//Maximum Supported Arguments Length
//CH34 124782
//FF29 500000
//SF7 65536
//Maximum Call Stack Size
//CH34 20926 in <script>, 20804 in console
//FF29 21###(varies) in <script>, 49993 in console
//SF7 43517 in <script>, 43509 in console