break文とcontinue文でのラベル指定

広告

JavaScriptでは任意の文に対してラベルを指定することができます。書式は次の通りです。

ラベル名: 文

ラベル名には変数名と同じ識別子を指定します。(識別子については「変数名のつけ方(識別子)」を参照して下さい)。

ラベルを付けることができる文は特に制限はありませんのでどのような文に対してラベルを付けることができます。では具体的な利用方法を見ていきます。

ラベル付きのbreak文

break文はラベルを付けた書式が用意されています。

break ラベル名;

break文はラベルを付けずに実行した場合、break文を含む一番内側の繰り返し文の次へ処理が移ります。それに対してラベル付きのbreak文を実行した場合には指定されたラベルが付けられた文の次へ処理が移ります。

次の例を見てください。

loop: for (var i = 0; i < 5; i++){
  for (var j = 0; j < 3; j++){

    break loop;

  }
}

外側のfor文に対してラベル「loop」が付けられています。そして内側のfor文のブロック内にラベル付きのbreak文が記述されています。ラベルが無いbreak文を実行した場合、一番内側のfor文の次へ処理が移りますがラベルが付いたbreak文の場合はそのラベルが付けられた文の次へ処理が移ります。この場合は外側のfor文の次へ処理が移ります。

なおラベル付きbreak文はfor文やwhile文などの繰り返し処理以外の文でも使用することができます。単なるブロックに対してラベルを設定しその中でbreak文を実行する事も可能です。

target: {

  break target;

}

ただしラベルが付いた文の中に、そのラベルを指定したbreak文が含まれていなければなりません。

ラベル付きのcontinue文

continue文はラベルを付けた書式が用意されています。

continue ラベル名;

continue文はラベルを付けずに実行した場合、continue文を含む一番内側の繰り返し文の最後へ処理が移ります。それに対してラベル付きのcontinue文を実行した場合には指定されたラベルが付けられた文の最後へ処理が移ります。

次の例を見てください。

loop: for (var i = 0; i < 5; i++){
  for (var j = 0; j < 3; j++){

    continue loop;

  }
}

外側のfor文に対してラベル「loop」が付けられています。そして内側のfor文のブロック内にラベル付きのcontinue文が記述されています。ラベルが無いcontinue文を実行した場合、一番内側のfor文の次の繰り返しへ処理が移りますがラベルが付いたcontinue文の場合はそのラベルが付けられた文の次の繰り返しへ処理が移ります。この場合は外側のfor文の次の繰り返しへ処理が移ります。

break文の場合と異なりcontinue文の場合は繰り返し処理であるfor文やwhile文にしか使用することはできません。これはラベル無しのcontinue文の場合と同じです。

以上のようにラベルそのものはどのような文に対しても付けることができますが、break文やcontinue文でラベルを指定する場合には、ラベルを付けることができる文の種類が制限されることに注意して下さい。

サンプルコード

では簡単なサンプルで試してみます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>JavaScript テスト</title>
</head>
<body>

<script type="text/javascript" src="./js/script11_1.js">
</script>

</body>
</html>
document.write("<p>");

outloop: for (var i = 1; i < 5; i++){
  for (var j = 1; j < 5; j++){
    document.write(i + " × " + j + " = " + (i * j) + "<br />");

    if (i * j > 10){
      break outloop;
    }
  }
}

document.write("</p>");

上記を実際にブラウザ見てみると次のように表示されます。

p11-1

今回のサンプルでは乗算の結果が10を超えた場合に外側のループを抜けるようにしています。

サンプルコード

今度はラベル付きのcontinueのサンプルです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>JavaScript テスト</title>
</head>
<body>

<script type="text/javascript" src="./js/script11_2.js">
</script>

</body>
</html>
document.write("<p>");

outloop: for (var i = 4; i < 8; i++){
  for (var j = 1; j < 5; j++){
    document.write(i + " × " + j + " = " + (i * j) + "<br />");

    if (i * j > 10){
      continue outloop;
    }
  }
}

document.write("</p>");

上記を実際にブラウザ見てみると次のように表示されます。

p11-2

今回のサンプルでは乗算の結果が10を超えた場合に外側のループの次の繰り返しへ処理が移るようにしています。

( Written by Tatsuo Ikura )