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