コールスタック


JavaScriptは、呼び出しスタックを持つ単一スレッドプログラミング言語です.
これは一度に1つのことしか処理できないことを意味します.
function first() {
  second();
  console.log('첫 번째');
}
function second() {
  third();
  console.log('두 번째');
}
function third() {
  console.log('세 번째');
}
first();
third();

ソース-https://www.zerocho.com/category/JavaScript/post/597f34bbb428530018e8e6e2
  • JavaScriptエンジンがscript tagに初めて遭遇した場合、グローバルコンテキストが作成され、現在実行されている呼び出しスタックにプッシュされます.
  • の他の関数が呼び出されると、その関数の実行コンテキストが作成され、スタックの最上位にプッシュされます.
  • 実行コンテキストは、呼び出しスタックで最も上の関数を実行する.を選択します.(pop)
  • 呼び出しスタック内の各アイテムをスタックフレームと呼びます.

    スタックオーバーフロー


  • スタックサイズを超えたときに発生したエラー
    再帰を呼び出すと発生する可能性があります.
  • ```jsx
    function foo() {
    	foo();
    }
    foo();
    ```
    
    foo()함수가 종료 조건없이 계속해서 호출하게 됨에 따라, 함수의 스택 프레임이 계속해서 호출스택에 쌓이게 됨.
    
    어떠한 시점에서 호출스택의 함수 호출 수가 호출 스택의 실제 크기를 초과하게 되고, 브라우저는 오류를 발생시키고 함수가 종료됨.
    
    ```jsx
    Uncaught RangeError : Maximum call stack size exceeded 
    ```

    単一呼び出しスタックの問題


    JavaScriptでは呼び出しスタックが1つしかないため、1つの関数の処理が多くなり、他の関数の実行に影響を与える可能性があります.
    ワークスタックが占有されている場合、JavaScriptは後続のタスクを処理できません.
    多くのタスクの処理を開始すると、応答が長く中断される可能性があります.

    解決策


  • ひどうきコールバック
    非同期コールバックは、直ちに実行されるのではなく、特殊な時点で実行されるため、スタックに直接プッシュする必要はありません.
    イベントキューで非同期コールバックを処理します.
    ソース-https://new93helloworld.tistory.com/358