非函数的全局变量列表

时间:2013-07-16 19:03:59

标签: javascript

我想获得所有全局变量的列表。在另一个答案,我发现了这个:

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]);
        }
    }
}

但它仍然显示功能。 谢谢。

4 个答案:

答案 0 :(得分:2)

您可以在窗口上执行for..in,并检查每个项目以确保它不是一个功能:

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

FIDDLE

答案 1 :(得分:2)

在您的代码中,f [i]是密钥,而不是分配给密钥的值。所以......

你正在检查密钥的typeof是不是'函数',它不是'函数',它总是'字符串'。

您希望测试的是:

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

答案 2 :(得分:1)

你的方法是正确的,但这一行是错误的:

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

由于f是属性名称数组,因此项f[i]将始终为字符串。要检查相应的window属性是否为函数,请使用

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

答案 3 :(得分: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);

编辑:为结果集添加了唯一的过滤器... 编辑:删除重复收集