JavaScript入門 エラーのスタックの見方を覚えておくと役立つ!

JavaScript でプログラムが実行される時に、内部ではどのようなことが起こるのかを知っておくと、エラー発生時に役立ちます。

今回はスタックについて書きます。

エラーが出た

以下のようなコードがあります。

const hoge = str => {
  return foo(str + 'hoge');
}

const foo = str => {
  return huga(str + 'foo');
}

const huga = str => {
  return str.filter(s => s === 'f');
}

const result = hoge('tami')

hoge() を実行すると、foo() が実行され、その後huga() が実行されます。

hoge() -> foo() -> huga()

さて、このプログラムを実行するとエラーになります。以下のようなエラーが出力されます。

TypeError: str.filter is not a function
    at huga (/Users/tami/project/js-training/stack-test.js:10:14)
    at foo (/Users/tami/project/js-training/stack-test.js:6:10)
    at hoge (/Users/tami/project/js-training/stack-test.js:2:10)
    at Object.<anonymous> (/Users/tami/project/js-training/stack-test.js:13:16)
・・・以下略

この内容をスタックを学びながら解析します。

スタックとは

プログラムが実行されると、メモリにスタックという領域が確保されます。

ここには、実行されるコードが順番に積み重なっていきます

初めの状態

以下がプログラムを実行した直後の状態のスタックのイメージです。

main はこのプログラムの起点になるものと考えてください。

hoge()が実行される

まずhoge()の部分が実行されます。スタックにはhogeが積まれます。

foo()が実行される

次にfoo()です。同様にスタックにfoo()が積まれます。

huga() が実行される

最後にhuga()です。

エラーは huga() で発生します。

そのため、上記のスタックの状態でエラーが発生します。

冒頭のエラー内容に戻ります。

TypeError: str.filter is not a function
    at huga (/Users/tami/project/js-training/stack-test.js:10:14)
    at foo (/Users/tami/project/js-training/stack-test.js:6:10)
    at hoge (/Users/tami/project/js-training/stack-test.js:2:10)
    at Object.<anonymous> (/Users/tami/project/js-training/stack-test.js:13:16)
・・・以下略

TypeError: str.filter is not a function の下の行を見ると、huga, foo, hoge の順番で並んでいます。

そう、これは現在のスタックの状態を表しています。

エラー出力にはスタックの状態が乗るので、どのような流れでエラーに至ったかを知ることができます

これはエラーが発生した時の原因調査にはとても役立つことがあります。

全く馴染みのないプログラムでエラーが発生した際も、冷静にエラーのスタックを確認してみましょう。

きっと問題を解消するヒントが得られるはずです。