JS が動く順番を意識する

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

JS が動く順番を意識する とは

JavaScript が上から下へどう動くかを意識して、配列をログ風文字列に組み立てよう。本レッスンでは、JS が動く順番を意識する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

コードは上から下へ動く

JavaScript の基本ルールは、ものすごく単純です。「書いた順に、上から下に向かって実行される」。たったこれだけ。最初はあたりまえに思えますが、実はこのルールをきちんと意識できるかどうかが、初心者と中級者の分かれ目だったりします。

JavaScript

const a = 1; // 1 行目: a に 1 を入れる const b = a + 2; // 2 行目: a を使って b を作る (b = 3) const c = a + b; // 3 行目: a と b を使って c を作る (c = 4) console.log(c); // 4 行目: c の値を表示する

JavaScript のエンジンは、この 4 行をきっちり順番に処理します。2 行目 を実行する時点で a の値は確定していて、3 行目 を実行する時点で b の値も確定している、という前提でコードを書きます。

プログラミング初心者がよくやる間違いが、「下に書いてある関数を上から呼べると思っている」「同じ変数が複数の場所で書き換わって混乱する」など、実行順序を見失うパターンです。順番を意識する習慣は、デバッグの一番の武器になります。

関数の中身は「呼ばれたときに」動く

関数は定義した瞬間ではなく、呼ばれた瞬間 に中身が実行されます。これが理解できると、いろんな謎が一気に解けます。

JavaScript

console.log("A"); function greet() { console.log("B"); // この行は greet() が呼ばれたときに実行される } console.log("C"); greet(); console.log("D");

このコードを実行すると、画面には A C B D の順番に出ます。function greet() { ... } は「greet という関数を定義するだけ」で、中の console.log("B") はまだ実行されません。greet() を呼んだ瞬間にようやく B が出ます。

実行順序を図で見る

上のコードがどう実行されていくか、図で追ってみましょう。

diagram (will load when visible)

関数の定義は「準備」、関数の呼び出しが「実行」、と覚えてください。greet が定義されているだけのときは中身は動かず、greet() と書いて初めて中の処理が走ります。

配列をログ風文字列に組み立てる

もう少し実践的な例で、実行順序を意識する練習をしてみましょう。配列の中身を 1 行ずつ並べた文字列を組み立てる、というシナリオです。

JavaScript

const names = ["Alice", "Bob"]; let log = ""; log = log + "[1] " + names[0] + "\n"; // log = "[1] Alice\n" log = log + "[2] " + names[1] + "\n"; // log = "[1] Alice\n[2] Bob\n" console.log(log);

log という変数を空文字で始めて、1 行ずつ追加していくと、最終的に複数行の文字列ができあがります。代入の右辺は 代入する前の値 を使うので、log = log + "..." という書き方が成り立ちます。

「右辺を計算する → 左辺に代入する」が代入のルールです。だから let x = 0; x = x + 1; と書くと、まず右辺の x + 1 (= 1) が計算され、それが x に代入される、という流れになります。

\n 改行とエスケープ

文字列の中で改行を入れたいときは、\n というエスケープシーケンスを使います。\ (バックスラッシュ) と n の 2 文字ですが、文字列の中では「改行 1 文字」として扱われます。

JavaScript

const multiLine = "1 行目\n2 行目\n3 行目"; console.log(multiLine); // => 1 行目 // 2 行目 // 3 行目

テンプレートリテラル (` で囲む) なら改行をそのまま入れられますが、プラス + 連結や JSON 文字列など、\n が便利な場面もまだまだ多いです。

よくある間違い

実行順序まわりでよくある落とし穴を 3 つ紹介します。

  • 変数を使う前に定義していないconsole.log(x); const x = 1; のように、宣言の前に使うと ReferenceError になります。「上から順」のルールを守りましょう
  • 関数の中で外の変数を変えたつもりで変わっていない — 関数の中で letconst で再宣言すると、外の変数とは別物になります。スコープという概念で第 6 章でじっくり扱います
  • \n/n と書く — エスケープシーケンスは \ (バックスラッシュ) が必須です。/ ではただの 2 文字として扱われ、改行になりません

実行順序がわからなくなったら、console.log("step 1") のような目印をいくつも入れて、どの順番で表示されるかを確認してみましょう。「動きを見える化」するのがデバッグの基本です。

やってみよう

それでは課題に挑戦しましょう。formatList という関数を作って、配列をログ風の文字列に整形します。

  1. 引数 items (文字列の配列) を受け取る
  2. 空の文字列 log から始めて、items[0] items[1] の順に追加していく
  3. 各行は "[番号] 値\n" の形 (番号は 1 から始まる)
  4. 最後にできあがった文字列を return する

formatList(["Alice", "Bob"])"[1] Alice\n[2] Bob\n"formatList(["Tokyo", "Osaka", "Kyoto"])"[1] Tokyo\n[2] Osaka\n[3] Kyoto\n" を返します。空配列なら空文字 "" を返してください。

ヒントとしては、for ループでまだ習っていない場合は、配列の長さに応じて手で 1 行ずつ書き足しても OK ですが、for ループを使うとどんな長さでも対応できます。for 文は第 5 章で本格的に学びますが、ここで一足先に触れておくと、後の章がスムーズになります。

よくある質問

Q. ブラウザと Node.js で動作は変わりますか?

A. JavaScript の構文・組み込み機能(配列・文字列・Promise 等)はどちらでも同じです。違いは DOM API(ブラウザ専用)と fs などのファイル系(Node 専用)など、実行環境固有の機能です。コアロジックは両方で動くため、テストもしやすくなります。

Q. ES6 以降の新機能は使っても大丈夫ですか?

A. 現代のブラウザ・Node.js は ES2020 以降の機能をほぼサポートしています。古い IE 等を対象にする必要が無ければ、let/const、アロー関数、分割代入、async/await を積極的に使ってください。トランスパイル(Babel/Vite)が必要なケースは年々減っています。

Q. TypeScript に進む価値はありますか?

A. 型情報があるとリファクタやエディタ補完が劇的に効くため、規模が大きくなるなら TypeScript への移行を強くおすすめします。最初は any を許容しつつ徐々に型を付ければ、JS の知識をそのまま活かせます。

次のレッスン

次は 第1章まとめクイズ で、JavaScript が上から下へどう動くかを意識して、配列をログ風文字列に組み立てよう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 実行順序 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 実行順序 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 関数名は formatList、引数は配列 items の 1 つ
  2. 各要素を "[番号] 値\n" 形式に整形して連結する (番号は 1 始まり)
  3. 戻り値は連結された 1 本の文字列

入出力例

test-cases.txt

formatList(["Alice","Bob"]) → "[1] Alice [2] Bob " formatList(["Tokyo","Osaka","Kyoto"]) → "[1] Tokyo [2] Osaka [3] Kyoto " formatList(["Solo"]) → "[1] Solo " formatList([])""

ヒント

main.js
main.js
学習モード

メモ

JS が動く順番を意識する

⌘S で保存