2013-05-24 7 views
5

windowのユーザー定義のすべての変数のリストを取得したいとします。つまり、ECMAScriptでブラウザが作成または定義したプロパティやオブジェクトではありません。例えばJavaScript:指定されたスコープで非ネイティブオブジェクトを列挙します

、のは、ページ上でこのスクリプトがあります言わせて:

<script> 
    window.__$DEBUG = true; 
    var Analytics = function() {}; 
</script> 
私は windowをループのことができるようにと __$DEBUGとその値、および Analyticsとその値を含むリストを取得したいと思い

var nonNatives = (function nonNative(scope) { 
    var result = {}; 
    for (var child in scope) { 
     if (!isNative(child)) { 
      result[child] = scope[child]; 
     } 
    } 
    return result; 
})(window); 

これを行うことはできますか?

+0

脇ブラウザ定義変数の膨大なリストを維持する:(setTimeout付き)関数は、例えば、リストを比較して、次の時間のためにそれを更新するには? –

+0

はい、かなりお待ちください。 :) – core

+0

可能な複製:http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object – BentOnCoding

答えて

6

私はこれまで、windowの現在のキー(つまり組み込みのプロパティ)を記憶し、再度呼び出されたときに違いを表示する単一の関数(他のJSの前に読み込まれた)を作成しました。

偶然にグローバル変数を検出するだけの目的であれば、前述の関数はスコープ内の現在のリストを含む匿名IIFE(それ自体がグローバルスコープを汚染しないようにすることができます)

(function(scope) { 

    var keys = Object.keys(scope); 
    var map = {}; 
    for (var i = 0, n = keys.length; i < n; ++i) { 
     map[keys[i]] = 1; 
    } 

    (function update() { 
     var current = Object.keys(scope); 

     // compare lists and print the differences 
     for (i = 0, n = current.length; i < n; ++i) { 
      var name = current[i]; 
      if (!(name in map)) { 
       console.log(name + ' = ' + scope[name]); 
       map[name] = 1; 
      } 
     } 

     // loop 
     setTimeout(update, 1000); 
    })(); 

})(window); 
+0

これはuserscriptの形式にすることができますか?つまり、サーバーレスポンスを変更できない人が何らかの方法で対処できますか? –

+0

@JanDvorakそれは可能だと思いますが、ユーザスクリプトが常に最初に読み込まれるようにし、ユーザスクリプトがメインページの 'window'オブジェクトに実際にアクセスできるかどうかを確認できる場合のみです。 ISTRでは、それを防ぐかもしれないuserscriptsに制限があります。 – Alnitak

+0

Tampermonkeyでは、document-start/document-body/document-endでスクリプトを実行するかどうか、また別のuserscriptの順序を設定することができます。それで実現可能です。 IIRC、Greasemonkeyは同じことを可能にします。 –