まずは下記のHTMLをブラウザで開いてみてください
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>`var` test</title>
</head>
<body>
<script>
var A = "hoge";
B = "fuga";
document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
delete this.A;
delete this.B;
document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
document.close();
</script>
</body>
</html>
の記述の通り、トップレベルのコンテキストでのvar
により宣言された変数はグローバルオブジェクト(トップレベルにおいてthis
で参照でき、通常ブラウザではwindow
でも参照できる)の変更不可能(configurable: false)なプロパティとなり、delete
を行っても何も変化はありません。1
そのため、表示は以下の通りになります(Chrome 39, Firefox 34, IE 11で確認)
(this === window) = true, A = hoge, B = fuga
(this === window) = true, A = hoge, B = undefined
しかし、Firefox 34で空のドキュメントを開いている状態でスクラッチパッドを開き、
var A = "hoge";
B = "fuga";
document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
delete this.A;
delete this.B;
document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
document.close();
を実行した場合は表示は以下の通りになります
(this === window) = true, A = hoge, B = fuga
(this === window) = true, A = undefined, B = undefined
このコンテキストでのthis.A
が変更不可能となっていません。そもそもthis.A
自体が作成されないのであれば
(function() {
// ここ
}).call(this);
の中身として実行されているとも解釈できるのですが、それとも異なるようです。
実際どうなのかは詳しく調べないとわからないと思うのですが、少なくともトップレベルとはこのような挙動の違いがあることは確かです。
-
strictモード時は未宣言の変数への代入
B = "fuga";
および変更不可能なプロパティの削除delete this.A;
が実行時エラーとなります。 ↩