Javascript 中有没有办法在页面上获取列表或转储由 Javascript/jQuery 脚本声明的所有全局变量的内容?我对数组特别感兴趣。如果我能得到数组名称,对我来说就足够了。看到它的value是一种奖励。
Javascript - 转储所有全局变量
IT技术
javascript
jquery
2021-03-12 12:46:17
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 );
}
以下函数仅转储已添加到 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
检查就足够了。
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] + '!');
}
}
其它你可能感兴趣的问题