一般代码也许不会涉及最大參数长度和最大栈深度,但某些特殊场合,检測这两个參数还是有必要的。比如:用递归计算斐波那契数列的第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
时间: 2024-10-06 05:26:59