画面遷移してもオブジェクトが残る?
JSを書いていて、宣言していないのに宣言されていたり代入していないのに値が入っていたり、、、
変な挙動をしていたので原因を調べてみました。
画面遷移してもグローバル変数のオブジェクトが残っていることが・・・?
ものは試しで、まずは以下のプログラムを同じ画面でglobal1, global2, global1の順に開いてみてください。
すると、宣言していないnameでエラーでないし、global1の挙動が変わります。
なにこれこわい。
<script>
eval(name);
</script>
<script>
name = 'alert("Hello!!!")';
</script>
原因
ということで早速原因なのですが、nameが残った原因は、windowオブジェクトのnameプロパティの仕様によるものでした。
nameはブラウザのウィンドウが開かれた際にウィンドウ自体を指すwindowオブジェクトができた際に生成され、画面が遷移してもウィンドウが閉じられなければそのまま残ります(ドメインが変わると残りません)。
結局のところ、global2.htmlでalertメソッドを表す文字列をnameに設定し、global1.htmlでグローバル変数のnameをeval関数で実行していたのでした。
evalこわい。
window.name確認
nameの確認をしておきましょう。
Developer toolの要素の検証>Sources内で変数宣言しているところなどにbreak pointを仕掛けてあげて、右のカラムのglobalからnameを確認することができます。
nameはwindowの名前を表し、初期値は空文字で、任意の文字列を設定することができます。
その他のオブジェクトについて
globalには600以上のオブジェクトが表示されています。
気になってブラウザで生成される600以上のオブジェクトをチェックしました。
全部やりましたが、結局残るのはnameだけでした。残念。
なんでこんな仕様になっているのかいまいちわかりませんが、
nameを使ったクロスドメイン通信などなど、色んな使われ方がされているみたいです。
おしまいっ