JavaScript

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

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

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