2013-07-16 29 views
1

我想獲取所有全局變量的列表。在另一個答案,我發現這個:不是函數的全局變量列表

Object.keys(window); 

問題是,它還列出了全局定義的函數名稱。有沒有辦法獲得那些不是功能的方法?

我嘗試這樣做:

function Test() { 

    var f = Object.keys(window); 

    for (var i = 0; i < f.length; i++) { 

     if (typeof (f[i]) !== 'function') { 

      console.log(f[i]); 
     } 
    } 
} 

但它仍然顯示功能。 謝謝。

+0

將它們濾出?如果你的意思是沒有單一的函數來獲取所有不可調用屬性的所有屬性名稱。 – Bergi

+1

[hasOwnProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)和[typeof operator](https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Operators/typeof) – epascarello

回答

2

你可以在窗口for..in,檢查每一個項目,以確保它不是一個功能:

var globalVars = []; 
for (var name in window) { 
    if (window.hasOwnProperty(name) && typeof window[name] != "function") { 
     globalVars.push(name); 
    } 
} 

FIDDLE

+0

出於某種奇怪的原因,它仍然顯示函數 – frenchie

+0

存在拼寫錯誤。 – georg

+0

好的,謝謝你的回答。 – frenchie

2

在你的代碼F [i]是關鍵,而不是價值分配給密鑰。所以...

你正在檢查鍵的typeof不是'函數',它不是,它總是'string'。

你想爲你測試的是:

if (typeof(window[f[i]]) !== 'function') 
+0

明白了,謝謝! – frenchie

+0

沒有輸入? – flup

+0

哎呀,謝謝你的收穫。 – Paul

1

你的做法是正確的,但此行是錯誤的:

if (typeof (f[i]) !== 'function') { 

由於f是屬性名稱的數組,項目f[i]將始終是一個字符串。要請檢查是否各自window屬性是一個函數,使用

if (typeof window[f[i]] !== 'function') { 
1

這裏是一個全面上市:

var globals=Object.getOwnPropertyNames(__proto__) 
    .concat(Object.getOwnPropertyNames(window)).filter(function(a){ 
    return !String(this[a]).match(/^function/) && typeof this[a] !== "function"; 
}).sort().filter(function(a,b,c){return c.lastIndexOf(a)===b; }); 

alert(globals); 

編輯:增加了獨特的過濾網到結果集... 編輯:刪除重複採集

+0

你對'Object.keys(window)'有什麼期望,既不是'window'的屬性,也不是它的原型? – Bergi

+0

我認爲當我加入時我有不同的計數。鍵(),我想知道爲什麼,但我一定是看錯了什麼,好趕上,謝謝! – dandavis