Panda Noir

JavaScript の限界を究めるブログです。

ifのあとにブロックつけるつけない問題に新展開が来てたよ!

2015年に!

ブロックつけるつけない戦争

ブロックつけるつけない戦争は、「ブロックをつけることでプログラムの読み間違えを防げる」「単文なのにブロックをつけるのは見づらいだけだ」など様々な議論が交わされ、血で血を洗う戦争でした。

if (hoge) {
    f();
}

if (fuga) g();

が、ES2015となり新展開が来ました。

そう、「ブロックスコープ」が導入されました。

ブロックスコープとは

ブロックスコープとはその名のとおり、ブロックで囲われたスコープのことです。いわずもがなletとconstを使うことでブロックスコープ変数の宣言ができます。

さて、このブロックスコープがブロック戦争に新展開をもたらしたのです。次のプログラムをご覧ください

if (true) const a = 3;

if (true) {
    const a = 3;
}

以前ならこの二つは同一の動作をすることを求められていました。しかし、ブロックスコープが導入された今、これを実行するとどうなるのでしょうか?

正解は、「上はエラーを吐き、下は正常に実行される」です。そうです、 ブロックの有無がプログラムの動作に違いをもたらしたのです !ついに、派閥がどうであれブロックをつけなければいけない時代がやってきたのです。

戦争が終結…?

これで派閥がどうであってもブロックつけなければならない事態ができたのでめでたしめでたし… とはなりません。それはそうです。ifやfor、whileなどブロックをつけずに変数を宣言のみすることはありますか?全く意味がないコードですよね。その文を実行する前と後で一切の変化が起きていません。つまり、 上のコードは、実際の場面ではまず書くことがないコード です。

というわけで新展開はきたものの、戦争は終結しませんでした。

終わりに

文中のコードが吐く「Declaration outside statement context」というエラー、調べても出てこなかったので詳細しっている方がいらしたら教えてください…

ちなみに私はブロックつけない派です。