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

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

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

time 2013/12/27

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から対応しています。
クロスブラウザ対応を考えると、実用化はまだ先の話になりそうですね^^;

sponsored link

コメント

  • ES5ではなくES6です。
    IEは11から対応しています。

    by AJ €2013年12月27日 4:45 PM

  • ご指摘ありがとうございます。
    本を読み返しても「ES5にはないが、JSの独自拡張にある」との記載がありました。
    (2011年に書かれた本なので)
    どこで間違えたのか、完全に私の勘違いです^^;
    訂正させていただきます。

    by m_doi2 €2013年12月27日 5:22 PM

down

コメントする




プロフィール

土斐崎 将範

土斐崎 将範

フリーランス/エンジニア (主にサーバサイド、その他広く浅く) 自宅の作業場は冷蔵庫の隣。 キッチンエンジニアとして日々精進しています。



sponsored link