QA@IT

Firebug のコンソールで var で宣言した 変数を delete 演算子で削除できるのはなぜか

1962 PV

書籍「開眼! JavaScript - O’Reilly Japan」に「delete 演算子は var で宣言した変数には適用されない」とありました。実際に、サンプルコードを jsFiddle で実行するとそれが確認できます( http://jsfiddle.net/jseja/6Xyh3/ )。しかし、Firebug 1.11.4 では、以下のように var で宣言した a も削除されているような結果となります。何か Firebug の制約だと思うのですが、これはなぜなのでしょうか。

var a = 10;
delete a;
console.log(a); //=> ReferenceError: a is not defined

以下のように展開されているのですが、Mozilla Developer Network: with を読んでも原因がわかりませんでした。

with(_FirebugCommandLine){
var a = 10;
delete a;
console.log(a); //=> ReferenceError: a is not defined
};

「開眼! JavaScript - O’Reilly Japan」の該当箇所の内容は delete 演算子メモ - わからん に書きました。

回答

きちんとした回答というわけではないですが、参考レベルで。
FireBugとWebコンソールでも少し違いがあるようです。

たとえば Webコンソールでdeleteするとfalseが返ります

[01:27:28.877] var c = 90
[01:27:28.882] undefined
[01:27:31.325] delete c
[01:27:31.330] false

FireBugではtrueです。

>>> var d = 30
undefined
>>> delete d
true

FireBugで宣言した変数をWebコンソールでdeleteするとtrueが返ります

>>> var e = 40
undefined
--
[01:29:44.861] e
[01:29:44.864] 40
[01:29:48.765] delete e
[01:29:48.769] true

Webコンソールで宣言した変数はFireBugからは参照できません

[01:31:05.622] var f=50
[01:31:05.623] undefined
--
>>> f
ReferenceError: f is not defined

FireBugとWebコンソールでは constructor.name の値が異なります

>>> constructor.name
"Object"
--
[01:32:43.149] constructor.name
[01:32:43.150] undefined

このようにそもそも実行している空間が異なるように思います。
thisが指すWindowオブジェクトは一見同じですが、細かく比較すればここにも違いがあるかもしれませんね。
AddOnという性質上、丸ごとページのっとれないよう何かしらの制限が入っているのかもしれません。

編集 履歴 (0)
  • > そもそも実行している空間が異なる
    > AddOnという性質上、丸ごとページのっとれないよう何かしらの制限が入っているのかも

    たしかにそんな気はします。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。