PCがあれば何でもできる!

へっぽこアラサープログラマーが、覚えたての知識を得意げにお届けします

JavaScriptで馴染めない仕様(ブロックスコープ)

JavaScriptの基礎を身につけようと、「パーフェクトJavaScript」を読んで勉強しています。
大体3分の1くらい読み終えました。レビュー通りの良本です。

 

しかし、今までクラスベースのコードしか触っていないこともあり、馴染めそうにない仕様も結構あります。この辺りは今後、自身の復習も兼ねてご紹介していけたらと思います。
ひとまず今日は、だいぶ夜遅くなってしまったので簡単なものだけ。

 

なんと…
JavaScriptにはブロックスコープの概念がない!
(正確にはちょっと前までなかった)

 

極端な話、これもありらしい。

function test() {
  if (true) {
    var s = "test";
  }
  document.write(s); // testを出力
}

 んんん、違和感。

 

しかし、EcmaScript 5 EcmaScript 6から後付けでブロックスコープが追加される。
ブロックスコープで扱いたい変数はvarではなくletで宣言。

function test() {
  if (true) {
    let s = "test";
  }
  document.write(s); // undefinedになる
}

 

ただし注意点として同名の変数があれば内側のスコープが優先される。

function test() {
  let x = 1;
  if (true) {
    document.write(x); // undefinedになる(let x = 2 のスコープ)
    let x = 2;
    document.write(x); // 2を出力
  }
  document.write(x); // 1を出力
}

 

文や式での記述も可能。C#のusingチックでいいかも!

function test() {
  var x = 1, y = 1;
  let (x = 2, y = 2) {
    document.write(x + y); // 4を出力
  }
  document.write(x + y); // 2を出力
}

 

ただ、EcmaScript 5なのでIE8では動かないらしい…。
なるほど、こうして少しずつ殺意が芽生えていくのですね。
→AJ さんより以下のご指摘をいただきました。ありがとうございました。
>ES5ではなくES6です。
>IEは11から対応しています。
クロスブラウザ対応を考えると、実用化はまだ先の話になりそうですね^^;