「JavaScript/例外処理」の版間の差分
削除された内容 追加された内容
s/alert/console.log/、windows.alert() はブラウザー環境でしか提供されていないので、より偏在する Console API を使うように改訂した。 タグ: 2017年版ソースエディター |
→大域脱出: {{Main|JavaScript/制御構造#ラベル}} タグ: 2017年版ソースエディター |
||
84 行
==大域脱出==
{{Main|JavaScript/制御構造#ラベル}}
例外は大域脱出に使うこともできます。大域脱出とは、入れ子になった制御構造の内側から外側に制御を戻すことです。ラベルを伴わない<code>break</code>や<code>return</code>は最内側の制御構造(<code>for</code>/<code>while</code>/<code>switch</code>と関数)を抜け出すだけですが、例外を<code>throw</code>すると文や関数を超えて制御が移りま
この性質を利用すると二重以上のループや関数を脱出することができるのです。
しかし、大域脱出目的の例外の使用には慎重になってください。breakやreturnを
;イテレーションメソッドからの脱出
:Array.prototype.forEach メソッドの様にcallbackの反復処理を行うイテレーションはbreakやreturnでは脱出ができないので、例外による大域脱出が適用なケースです。
:この場合も、for文に置換えるほうが可読性は向上するでしょう。
;関数外のラベルにはbreakできない(動かない例):<syntaxhighlight lang="javascript">
ary = new Array(10).fill(0).map((x, i) => i)
LABEL:
▲しかし、大域脱出目的の例外の使用には慎重になってください。breakやreturnを[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/label ラベル]と共に使用することで、ほとんどの場合は大域脱出を使うことなく要件を達成できます。
ary.forEach(function(x) {
if (x > 5)
break LABEL; // SyntaxError: Undefined label 'LABEL'
console.log(x)
})
</syntaxhighlight>
;[https://paiza.io/projects/0HdEI0i8b0OJNy-HToq1Ig?language=javascript 例外を使ったイテレーションメソッドからの脱出]:<syntaxhighlight lang="javascript">
ary = new Array(10).fill(0).map((x, i) => i);
try {
ary.forEach(function(x) {
if (x > 5) {
throw new Error(`x = ${x}`);
}
console.log(x)
});
} catch {}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="text">
0
1
2
3
4
5
</syntaxhighlight>
{{Nav}}
|