「JavaScript/例外処理」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
s/alert/console.log/、windows.alert() はブラウザー環境でしか提供されていないので、より偏在する Console API を使うように改訂した。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎大域脱出: {{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を[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/label ラベル]と共に使用することで、ほとんどの場合は大域脱出例外を使うことなく要件大域脱出を達成できます。
;イテレーションメソッドからの脱出
: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) {
breakやreturnでは大域脱出ができない Array.prototype.forEach メソッドの様にcallbackで反復処理を行う場合は、例外による大域脱出が適用なケースです。この場合も、for文に置換えるほうが可読性は向上するでしょう。
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}}