Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-转储所有全局变量_Javascript_Jquery - Fatal编程技术网

Javascript-转储所有全局变量

Javascript-转储所有全局变量,javascript,jquery,Javascript,Jquery,Javascript中有没有一种方法可以获取列表或在页面上转储Javascript/jQuery脚本声明的所有全局变量的内容?我对数组特别感兴趣。如果我能得到数组名,对我来说就足够了。查看其值是一种额外的功能。窗口是浏览器中的全局对象,您可以使用for..in循环来循环其属性: if(!Array.isArray) { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) ==

Javascript中有没有一种方法可以获取列表或在页面上转储Javascript/jQuery脚本声明的所有全局变量的内容?我对数组特别感兴趣。如果我能得到数组名,对我来说就足够了。查看其值是一种额外的功能。

窗口是浏览器中的全局对象,您可以使用
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] + '!');
    }
}
这将为您提供
窗口
对象(全局变量)的所有可枚举属性的数组

对于较旧的浏览器,包括


要查看它的值,很明显,您只需要一个典型的枚举器,如
for in


您应该注意到,我提到这些方法只会为您提供可枚举的属性。通常,这些将是环境中没有内置的

可以在支持ES5的浏览器中添加不可枚举的属性。这些将不包括在
对象.key
中,也不包括在使用
for in
语句时


如所述,您可以
Object.getOwnPropertyNames(窗口)
用于非枚举项。我不知道。谢谢@Raynos

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

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

for( var i = 0; i < keys.length; ++i ) {
    value = window[ keys[ i ] ];
    console.log( value );
}
var keys=Object.getOwnPropertyNames(窗口),
价值
对于(变量i=0;i
由于所有全局变量都是
窗口
对象的属性,因此可以使用以下方法获取它们:

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; }
以下是测试:

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

(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);
    };
})();
(函数(){

//noprotect您可以使用名为的npm包。它将
窗口的属性与新创建的
iframe
进行比较,以仅打印开发人员声明的变量,而不是浏览器供应商声明的变量。

Greasymonkey脚本以获取泄漏的全局变量

// ==UserScript==
// @name        SCI
// @namespace   ns
// @version     1
// @grant       none
// @run-at      document-start
// ==/UserScript==
console.log('SCI loaded');
var SCI = window.SCI = {
        defprops: [],
        collect: function(){
            var wprops = [];
            for(var prop in window){
                wprops.push(prop);
            }
            return wprops;
        },
        collectDef: function(){
            this.defprops = this.collect(); 
        },
        diff: function(){
            var def = this.defprops,
                cur = this.collect();
            var dif = [];
            for(var i = 0; i < cur.length; i++){
                var p = cur[i];
                if(def.indexOf(p) === -1){
                    dif.push(p);
                }
            }
            return dif;
        },
        diffObj: function(){
            var diff = this.diff();
            var dobj = {};
            for (var i = 0; i < diff.length; i++){
                var p = diff[i];
                dobj[p]=window[p];
            }
            return dobj;

        }
};
SCI.collectDef();
/==UserScript==
//@name SCI
//@ns
//@version 1
//@grant none
//@在文档开始时运行
//==/UserScript==
console.log('SCI-loaded');
var SCI=window.SCI={
defprops:[],
collect:function(){
var wprops=[];
用于(窗口中的var prop){
推动(支柱);
}
返回wprops;
},
collectDef:function(){
this.defprops=this.collect();
},
diff:function(){
var def=this.defprops,
cur=this.collect();
var-dif=[];
对于(变量i=0;i

要使用run-in-console
SCI.diff()
获取名称列表,或者使用
SCI.diffObj()
获取带有变量的对象,这里有一个简单、更现代的代码段,它记录了带有全局变量及其值(而不仅仅是全局变量名)的对象,这通常是我在调试时要查找的:

(函数(){
常量iframe=document.createElement('iframe')
iframe.setAttribute('hidden','')
iframe.src='about:blank'
iframe.onload=函数(){
//遍历当前“窗口”的属性并减少输出
//仅对不在iframe的“窗口”中的属性执行此操作。
console.debug(Object.entries(window).reduce((reducedObj,[property,value])=>{
//检查iframe中是否不存在该属性,如果存在,则将其添加到
//输出对象。
if(!(iframe.contentWindow中的属性))
reducedObj[属性]=值
返回还原bj
}, {})))
//通过从DOM中删除iframe来清理它。
iframe.remove()
}
//将iframe附加到DOM以启动加载。
document.body.append(iframe)
})()
提示:您还可以将
'about:blank'
窗口位置进行交换,以仅获取自首次加载页面以来设置的全局值


这使用iframe来确定要忽略的属性,但是它是基于。

不符合严格模式,顺便说一下:)嗯…因为这是真的?在兼容ES5的浏览器上看一下:@c-smile In strict mode当没有上下文时,
这是
null
。它不是全局对象。@HoLyVieR:最后,挑剔一点,它不是
null
,它是
未定义的
:)这不就是全局使用
this
的方法吗?
this===globals()
在Firefox和节点控制台中计算为
true
,因为
全局使用
对象。getOwnPropertyNames(窗口)
用于不可枚举的hanks@Raynos。我不知道。添加到答案中。在Chrome上,
window
的一些属性继承自
window.prototype
window
。它们可以作为全局变量访问,但您需要将
对象.getOwnPropertyNames
结果集中在
window
window上
窗口。prototype
也看到了这个答案:将两者结合起来对我来说非常有效。我知道这是一个相当古老的答案,但是
不推荐使用“Window.webkittstorageinfo”。请使用“navigator.webkitTemporaryStorag”
// ==UserScript==
// @name        SCI
// @namespace   ns
// @version     1
// @grant       none
// @run-at      document-start
// ==/UserScript==
console.log('SCI loaded');
var SCI = window.SCI = {
        defprops: [],
        collect: function(){
            var wprops = [];
            for(var prop in window){
                wprops.push(prop);
            }
            return wprops;
        },
        collectDef: function(){
            this.defprops = this.collect(); 
        },
        diff: function(){
            var def = this.defprops,
                cur = this.collect();
            var dif = [];
            for(var i = 0; i < cur.length; i++){
                var p = cur[i];
                if(def.indexOf(p) === -1){
                    dif.push(p);
                }
            }
            return dif;
        },
        diffObj: function(){
            var diff = this.diff();
            var dobj = {};
            for (var i = 0; i < diff.length; i++){
                var p = diff[i];
                dobj[p]=window[p];
            }
            return dobj;

        }
};
SCI.collectDef();