JavaScript
1
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

投稿日

グローバルスコープになっているユーザー定義の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;
}

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
nightyknite

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
2022年に流行る技術予想
~
1
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー