JavaScriptのスタックオーバーフロー

1529 ワード

今日はJavaScriptのスタックが溢れています.
一、スタックオーバーフローとは?
       JavaScriptコードを実行するたびに、一定のサイズのスタック空間(Windowsシステムでは1 M)が割り当てられます.メソッドコールのたびに、スタックに一定の情報(パラメータ、局所変数、戻り値など)が格納されます.これらの情報は少なくとも一定の空間を占有します.つまり、スタックに割り当てられたローカルデータブロックのサイズを無視して、このデータブロックに過多なデータを書き込み、データの境界を越えた結果、他のデータをカバーしたということです.
二、引き起こした原因は何ですか?
     function isEven (num) {
    if (num == 0) return true;
    if (num == 1) return false;
    return isEven(Math.abs(num) - 2);
}
console.log(isEven(1000000000000));  //output Uncaught RangeError: Maximum call stack size exceeded
     多すぎる関数呼び出しのために、スタックを呼び出してこれらの呼び出しの返信アドレスを収容できなくなり、通常は再帰的に生成される.スタックオーバーフローは無限再帰(Infinite recursion)によって発生する可能性が高いが、過剰なスタックレベルにすぎないかもしれない.
 
三、どう解決しますか?
1、setTimeout()を使って解決する(推奨)
  function callback(f) {
    f();
  } 
 
  function foo() {
    foo(); //  1000             , 
    //setTimeout(foo, 0); //        
  }
 foo()
2、クローズドで解決する
function isEven(num){
    function isEvenInner(num){
        if(num === 0){return true;}
        if(num === 1){return false;}
        return function(){
        return isEvenInner(Math.abs(num)-2);
        }
    }

    function simplify(func,num){
        var value=func(num);
        while(typeof value == 'function'){
            value=value();
        }
        return value;
    }

    return simplify.bind(null,isEvenInner)(num)
}

console.log(isEven(100000));//num          
3、テールコールを使う(この方法はまだよく分かりません.詳しく知りたい友達は自分で資料を探すことができます.)
 
引き続き更新します.