Javascript - 转储所有全局变量

IT技术 javascript jquery
2021-03-12 12:46:17

Javascript 中有没有办法在页面上获取列表或转储由 Javascript/jQuery 脚本声明的所有全局变量的内容?我对数组特别感兴趣。如果我能得到数组名称,对我来说就足够了。看到它的value是一种奖励。

6个回答
Object.keys( window );

这将为您提供对象的所有可枚举属性的数组window(它们是全局变量)。

对于较旧的浏览器,请包含MDN 中的兼容性补丁


要查看其值,显然您只需要一个典型的枚举器,例如for-in.


你应该注意到我提到这些方法只会给你可枚举的属性。通常,那些不是环境内置的。

可以在 ES5 支持的浏览器中添加不可枚举的属性。这些不会包含在Object.keys, 或使用for-in语句时。


正如@Raynos所指出的,您可以 Object.getOwnPropertyNames( window )针对不可枚举。我不知道。谢谢@Raynos!

因此,要查看包含可枚举项的值,您需要执行以下操作:

var keys = Object.getOwnPropertyNames( window ),
    value;

for( var i = 0; i < keys.length; ++i ) {
    value = window[ keys[ i ] ];
    console.log( value );
}
您也可以Object.getOwnPropertyNames( window )用于不可枚举
2021-04-17 12:46:17
另请参阅此答案:stackoverflow.com/a/17246535/4040525将两者结合对我来说非常有用
2021-04-20 12:46:17
谢谢@Raynos。我不知道。补充回答。
2021-04-25 12:46:17
在 Chrome 上, 的某些window属性继承自Window.prototypeWindow他们是为全局访问,但你需要的concat在一起Object.getOwnPropertyNames的结果windowWindowWindow.prototype
2021-05-02 12:46:17

以下函数仅转储已添加到 window 对象的全局变量

(function(){
    //noprotect <- this comment prevents jsbin interference
    var windowProps = function() {
        // debugger;
        var result = {};
        for (var key in window) {
            if (Object.prototype.hasOwnProperty.call(window, key)) {
                if ((key|0) !== parseInt(key,10)) {
                    result[key] = 1;
                }
            }
        }
        window.usedVars = result;
    };

    var iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    iframe.src = 'about:blank'; 
    document.body.appendChild(iframe);
    var fwin = iframe.contentWindow;
    var fdoc = fwin.document;
    fdoc.open('text/html','replace');
    fdoc.write('<!DOCTYPE html><body><script>window.onload = ' + windowProps.toString() + '<\u002Fscript>');
    fdoc.close();

    var button = document.createElement('input');
    button.type = 'button';
    button.value = 'go';
    document.body.appendChild(button);
    button.onclick = function() {
        var clean = fwin.usedVars;
        windowProps();
        var dirty = window.usedVars;
        for (var key in clean) {
            delete dirty[key];
        }
        for (var variable in dirty) {
            var div = document.createElement('div');
            div.textContent = variable;
            document.body.appendChild(div);     
        }
        document.body.removeChild(button);
        document.body.removeChild(iframe);
    };
})();

它的工作原理是使用 iframe 获取一个干净的全局窗口变量列表,然后将其与当前窗口中的全局变量列表进行比较。它使用按钮是因为 iframe 异步运行。该代码使用全局变量,因为这使代码更易于理解。

您可以在此处此处看到它的工作情况,但请注意,这些示例显示了 jsbin 本身“泄漏”的许多全局变量(根据您使用的链接而有所不同)。

由于所有全局变量都是window对象的属性,您可以使用以下方法获取它们:

for(var key in window) { // all properties
    if(Array.isArray(window[key])) { // only arrays
        console.log(key, window[key]); // log key + value
    }
}

由于所有默认/继承的属性都不是普通数组(主要是宿主对象或函数),因此Array.isArray检查就足够了。

要获取“全局”对象,您可以使用此函数:

function globals() { return this; }

这是测试:http : //jsfiddle.net/EERuf/

@HoLyVieR:最后,挑剔一点,不是null,是undefined:)
2021-04-19 12:46:17
嗯……因为这是真的?在兼容 ES5 的浏览器上看一下jsfiddle.net/G95gQ
2021-05-01 12:46:17
这不是和this全局使用一样吗?在 Firefox 和 Node 控制台中this === globals()评估为true,因为globalthis只是全局对象
2021-05-05 12:46:17
顺便说一下,不符合严格模式:)
2021-05-10 12:46:17
@c-smile 在没有上下文的严格模式下,thisnull. 它不是全局对象。
2021-05-13 12:46:17

window是浏览器中的全局对象,您可以使用for..in循环来遍历其属性:

if(!Array.isArray) {
    Array.isArray = function(obj) {
        return Object.prototype.toString.call(obj) === '[object Array]';
    };
}

for(var x in window) {
    if(Array.isArray(window[x])) {
        console.log('Found array ' + x + ' in ' + window + ', it has the value ' + window[x] + '!');
    }
}
我知道这是一个相当古老的答案,但是 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
2021-04-23 12:46:17