JavaScript 入門 - ジャンプ文

公開日:
更新日:
0JavaScript

ジャンプ文

JavaScript には、"ジャンプ文" と呼ばれる文があります。ジャンプ文を実行すると、JavaScript インタプリタはソースコードの別の場所にジャンプします。


例えば、break 文を実行すると、JavaScript インタプリタはループ文などの次の文にジャンプします。continue 文を実行すると、ループ文の本体をスキップし、ループ文の先頭に戻り、新たなループを実行します。また、文には名前 (ラベル) を付けることができます。このラベルを使って、break 文や continue 文で、どの文を対象にしているかを指定できます。

ラベル文

先頭に識別子(identifier)、その後ろにコロン(:)、最後に文を記述することで、任意の文にラベルを付けることができます。ラベル文の書式は次のとおりです。


identifier : statement

文にラベルを付けておけば、プログラムの他の場所からラベル名でその文を参照できます。どの文にもラベルを付けることはできますが、一般的にはループ文や条件文などの本体部分を持つ文にラベルを付けます。ループ文にラベルを付けておけば、break 文を使ってループを抜け出したり、continue 文を使ってループの先頭に戻り次のループを開始したりできます。文ラベルを使う JavaScript 文は、break 文と continue 文だけです。次の例では、while ループにラベルを付けて、continue 文でこのラベルを使っています。


mainloop: while(token != null) {
  // コード省略。
  continue mainloop; // 名前を付けたループ文の次のループを開始する。
  // コード省略。
}

identifier には、JavaScript で有効な識別子 (予約語を除く) をラベル名として指定します。ラベル名の名前空間は、変数名や関数名の名前空間と異なります。そのため、文ラベルには変数名や関数名と同じ識別子が使えます。

break 文

break 文がラベルなしで実行されると最も内側のループ、または switch 文を直ちに終了します。break 文はループ文や switch 文を終了させるものなので、これらの文の中でしか使えません。


何らかの理由でループの処理を途中で止めたいときに break 文を使用します。ループの終了条件が複雑になる場合、それらの条件をすべて 1 つのループ式内に記述するより、break 文を使用したほうが簡単です。


以下は、配列要素の中から特定の値を求めるコード例です。ループの処理は、配列の最後までループを繰り返せば処理を終了します。しかし、以下の例では求める値が見つかった時点で break 文により処理を終了します。


for(var i = 0; i < a.length; i++) {
  if (a[i] == target) break;
}

また、キーワード break の後ろにラベル名を指定することもできます。ラベル名は識別子だけを記述し、コロンは記述しません。この場合の書式は次のとおりです。


break labelname ;

ラベルが指定された break 文が実行されると、ラベルで指定された文の最後に処理が移動し、文が終了します。break 文を囲む文の中に、指定されたラベルを持つ文がない場合に、この形式で break 文を使うと構文エラーになります。break 文を含む文であれば、どれでもラベルに指定できます。ループや switch 文である必要はありません。例えば、複数の文を中括弧 ({}) で囲んだ文ブロックのラベルを指定することも可能です。キーワード break とラベル名の間に改行を入れないように注意してください。改行を入れると、JavaScript はセミコロンが省略されていると解釈して、自動的にセミコロンを挿入します。その結果、ラベルなしの break 文になってしまいます。入れ子型のループや switch 文を使用する場合、最も内側の文以外の文を終了させるにはラベル付きの break 文を使います。例を紹介します。


// 数値の 2 次元配列を取得する。
var matrix = getData();
// 行列中の数字をすべて加算する。
var sum = 0, success = false;
// ラベル文を使って、エラーが発生したときに抜け出す。
compute_sum: if (matrix) {
  for(var x = 0; x < matrix.length; x++) {
    var row = matrix[x];
    if (!row) break compute_sum;
    for(var y = 0; y < row.length; y++) {
      var cell = row[y];
      if (isNaN(cell)) break compute_sum;
      sum += cell;
    }
  }
  success = true;
}
// break 文はここにジャンプする。
// success==false という状態でここにたどりついたら、行列中に何か問題が発生している。
// false でなければ、変数 sum には、行列中のすべてのセルの合計値が含まれている。

ラベルの有無に関わらず、break 文では、関数の境界は越えられません。例えば、関数の定義文にラベルを付けて、関数中からこのラベルを使うことはできません。

continue 文

continue 文は、break 文とよく似ています。break 文はループを終了しますが、continue 文は次の繰り返しからループの処理を再開します。以下に示すように、ラベルを指定することもできます。


continue labelname ;

ラベルの有無に関わらず、continue 文はループの中でしか使えません。それ以外の場所で使用すると、構文エラーになります。


continue 文が実行されると、ループ内で現在実行中の繰り返し処理は中断され、次の繰り返しから処理を続行します。この定義は、ループの種類によって意味が異なります。


  • while ループの場合は、ループの先頭で指定された expression 式が再テストされ、その結果が true であれば、ループ本体を初めから実行します。

  • do/while ループの場合は、途中を飛ばしてループの最後にいき、そこに指定されたループ条件が再テストされ、その結果に応じてループの先頭から処理が再開されます。

  • for ループの場合は、ループ変数を更新する increment 式を評価してから test 式を再テストし、次の繰り返し処理へ進むかどうかが判定されます。

  • for/in ループの場合は、指定された変数に代入された次のプロパティ名から処理が再開されます。

continue 文の振る舞いが、while ループと for ループで異なることに注意してください。while ループの場合は条件へ直接戻りますが、for ループの場合は increment 式を評価してから条件へ戻ります。エラーが発生したときにループ内で現在処理中の繰り返しを中断させる、ラベル指定なしの continue 文の例は以下になります。


for(i = 0; i < data.length; i++) {
  if (!data[i]) continue; // 未定義の値に対しては処理できない。
  total += data[i];
}

break 文と同様、continue 文でもラベル付きの書式が使えます。入れ子になったループで再開すべきループが最も内側のループでない場合は、ラベル指定の書式を使います。キーワード continue とラベル名との間に改行を入れないようにします。これは、ラベル指定の break 文の場合と同じ注意です。

return 文

関数中で return 文を使うことで、関数呼び出しの値を指定します。return 文の書式は次のとおりです。


return expression ;

return 文は、関数の本体でしか使えません。それ以外の場所で使用すると、構文エラーになります。return 文を実行すると、この return 文を含む関数は、式の値を呼び出し元に返します。


function square(x) { return x*x; } // return 文を持つ関数。
square(2) // この呼び出しは4 と評価される。

return 文が関数中に含まれない場合、関数を呼び出すと、関数本体中の文を次々に実行していき、関数の最後に到達すると呼び出し元に戻ります。このような場合には、呼び出し式の値はundefined と評価されます。return 文は多くの場合、関数の最後の文として記述されます。ただし、最後でなければならないわけではありません。return 文を実行すると、以降に文が残っていたとしても、関数は呼び出し元に戻ります。return 文に式を指定しなくてもかまいません。この場合、undefined が呼び出し元に返されます。次の例を見てください。



function display_object(o) {
// 引数がnull またはundefined の場合、すぐに戻る。
if (!o) return;
// 関数の本体を記述する。
}

キーワードreturn と式の間に改行を入れないようにしてください。改行を入れると、JavaScript はセミコロン(;)が省略されていると解釈し、自動的に余計なセミコロンを挿入してしまいます(2.5 節を参照)。