複数のJavascriptが埋め込まれるようになってくると、ユーザー定義の変数やオブジェクトがグローバルに定義されているか知りたくなってきたんだけれども、
それらしい方法が見つからなかった。
window、top、selfオブジェクトからグローバルスコープのオブジェクトは参照できるので
下記のオブジェクトから
for (item in window) {
console.log(item);
}
とやればいいんだけれど、
windowオブジェクトの標準に備わっているプロパティ(onclick等々)も出力されてしまう。
https://developer.mozilla.org/ja/docs/Web/API/Window
なんとかして、ユーザ定義のだけ抽出したいということで、
苦肉の策で、空のウィンドウのwindowオブジェクト以下のプロパティ、メソッドの値を取得して、
それを除外したものがユーザ定義の変数、オブジェクトになるということでいけるじゃないかと思って
下記のスクリプト作ってみた。
var n1 = 1;
let n2 = 2;
const n3 = 3;
n4 = 4;
function doSomething() {
return true;
}
(function() {
// 即時関数を使うことで、この処理の変数がグローバルスコープにならないようにする。
// ダミーのウィンドウを開く。これが邪魔なので本当は無くしたい。
var win = window.open("","sample");
for (item1 in window) {
var userDefined = true;
for (item2 in win) {
if (item1 == item2) {
// 標準のプロパティで名前が存在したら出力しない
userDefined = false;
break;
}
}
if (userDefined) {
// 標準のプロパティでなかったものだけ出力する
console.log(item1);
}
}
}());
これを適当なサイトのブラウザのconsole上で実行する。
最初に、空のウィンドウが開いてしまうので、それは閉じてconsoleの結果を見ると、
ユーザ定義のグローバルスコープの変数、オブジェクトの名前が表示される。
ちなみに、下記のうち出力結果に表示されるのは「n1」と「n4」と「doSomething」
var n1 = 1;
let n2 = 2;
const n3 = 3;
n4 = 4;
function doSomething() {
return true;
}
空のウィンドウが表示されるのは邪魔だし、もう少し良い方法はないかな。。。