Posted at

グローバルスコープになっているユーザー定義のJavascript変数、オブジェクトを取得したい

More than 1 year has passed since last update.

複数の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;
}

空のウィンドウが表示されるのは邪魔だし、もう少し良い方法はないかな。。。