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

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

4

4 回答 4

2

你可以做一个for..in窗口,并检查每个项目以确保它不是一个函数:

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

小提琴

于 2013-07-16T19:08:24.167 回答
2

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

您正在检查密钥的 typeof 不是“函数”,它不是,它始终是“字符串”。

你想要的测试是:

if (typeof(window[f[i]]) !== 'function')
于 2013-07-16T19:12:40.820 回答
1

您的方法是正确的,但这条线是错误的:

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

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

if (typeof window[f[i]] !== 'function') {
于 2013-07-16T19:15:24.410 回答
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);

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

于 2013-07-16T19:15:53.180 回答