LoginSignup
15
15

More than 5 years have passed since last update.

画面遷移してもグローバル変数が残る例について

Posted at

画面遷移してもオブジェクトが残る?

JSを書いていて、宣言していないのに宣言されていたり代入していないのに値が入っていたり、、、
変な挙動をしていたので原因を調べてみました。

画面遷移してもグローバル変数のオブジェクトが残っていることが・・・?
ものは試しで、まずは以下のプログラムを同じ画面でglobal1, global2, global1の順に開いてみてください。
すると、宣言していないnameでエラーでないし、global1の挙動が変わります。
なにこれこわい。

global1.html
<script>
  eval(name);
</script>
global2.html
<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の名前を表し、初期値は空文字で、任意の文字列を設定することができます。
スクリーンショット 2014-05-12 14.46.30.png

その他のオブジェクトについて

globalには600以上のオブジェクトが表示されています。
気になってブラウザで生成される600以上のオブジェクトをチェックしました。
test.jpg

全部やりましたが、結局残るのはnameだけでした。残念。

なんでこんな仕様になっているのかいまいちわかりませんが、
nameを使ったクロスドメイン通信などなど、色んな使われ方がされているみたいです。

おしまいっ

15
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15