2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

2
1
0

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?