Javascript - 转储所有全局变量

Spa*_*Dog 36 javascript jquery

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

Rig*_*red 44

Object.keys( window );
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个包含对象的所有可枚举属性的数组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 );
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`Object.getOwnPropertyNames(window)`来表示非枚举 (7认同)

rob*_*cat 5

以下函数仅转储已添加到 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);
    };
})();
Run Code Online (Sandbox Code Playgroud)

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

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