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