ブクマコメントとブログコメントの方に前回の記事についていくつか指摘をいただきましたので、せっかくなので、掲載/検証させていただきますです。
( ´-`)。○(検証って何すればいいんだろう)
まずはブログコメントの方にいただいてたkanasanさんからのコメント。
window.selfですが、私はwindow.topやwindow.parent、window.openerと書式を合わせるためにあるのではないかと思っています。
言おうと思った時には、他の話題に移っていたので言えませんでしたが...。
なるほど。
階層が揃ってる事で、
a = 'self'; // or 'top' or 'parent' or 'opener'
window[a];
の形でアクセスできるので再帰とかで使いやすそう。
もっと有効な利用方法がありそうだけど、思い浮かばない(;´Д`)
次にはてブコメでいただいたamachangさんからのコメント。
1つ目。
ちなみに delete で false を戻す例: (function() { var a = 0; alert(delete a); alert(a); })()
ほんとだ!試してみたらfalseが帰ってきてデータが残ってる。
var a = 0; alert(delete a); alert(a);
の部分だけ実行しても、やはりtrueが帰ってきてデータがクリアされてる。
つまり関数内で定義された変数のみ、deleteできないということか。
なんでこんな実装になってるんだろう。
もしかしてと思い、html内に以下を記述してIEとFireFoxで確認してみた。
<script type="text/javascript" language="JavaScript">
<!--
var a = 0; alert(delete a); alert(a);
-->
</script>
この場合、IEもFxもfalseが返り、aには0が保持されたままになる。
つまるところ、FireBugのグローバルなvarの定義に問題があるのかもしれない。
varで定義した場合、既存のスコープの変数オブジェクトのプロパティに変数が作られる。
暗黙的な定義だとスコープチェインの最後、グローバルオブジェクトの変数オブジェクトのプロパティに作られる。
FireBugは暗黙的に作られたグローバル変数とvarで定義されたグローバル変数の区別つけれないのかな?
わからん|-◇-|
そもそもFireBugのコンソールの構造を俺は理解してないのだけど。。。
FireBugは表示ページのDOMWindow生成後に、ページのJSが実行される前に、実行コンテキストとwindowオブジェクトを受け取ってコンソール生成してるっぽいけど、、、
コンソールの実行ってevalなんだろうか|'◇'|?
試しに
<script type="text/javascript" language="JavaScript">
<!--
eval('var a = 0; alert(delete a); alert(a);');-->
</script>
をブラウザで実行してみたらtrueだった。
そゆこと|'◇'|?
※追記
JavaScriptのdelete演算子の動作について、nanto_viさんが詳しく書かれています。 必見です。
JavaScript の変数と delete 演算子: Days on the Moon
Firebugで実行される場合はやはりevalで実行され
・evalコード内でvar文で作られた変数(グローバルオブジェクトのプロパティ)はDontDelete属性を持たない
・evalコード内の関数内でvar文で作れたプロパティはDontDelete属性を持つ。
というのが、ここで書いていた事の結論みたいですね。
2つ目。
0 in test は 0 が '0' に暗黙的な型変換が行われているのに注目するといいですよ。
ぬ?
どゆこと|'◇'|?
試しに以下を動かしてみる。
test = new Array(5); test['0'] = 20; 0 in test;
true反ってきた|'◇'|!
じゃぁなんで
test = new Array(5); test[0] = 20; 0 in test;
でもtrue反ってくるんだろう。
JSの配列の添え字は、内部的に数字でも全て文字列に変換されてるってこと|'◇'|?
いや、そーゆー話しじゃなさそうだなぁ。
この動作が有効に活用できる場はどこだろう。。。
もうちょっと考えて見ます|'◇'|
kanasanさん、amachangさん、コメントありがとうございます><
勉強になりました><
( ´-`)。○(しかし呼び方は「かなさんさん」「あまちゃんさん」でいいのだろうか?)
( ´-`)。○(直接お会いしたときはさん付けてないのだけど、そっちも問題ある気がしてきますね)