一般代碼或許不會涉及最大參數長度和最大棧深度,但某些特殊場合,檢測這兩個參數還是有必要的。例如:用遞歸計算斐波那契數列的第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