JavaScript – 转储所有全局variables
有没有在JavaScript的方法来获取列表或转储页面上的JavaScript / jQuery脚本声明的所有全局variables的内容? 我对数组特别感兴趣。 如果我能得到数组名称,这对我来说就足够了。 看到它的价值是一个奖金。
Object.keys( window );
这会给你一个window
对象的所有可枚举属性的数组(全局variables)。
对于较旧的浏览器,请包含来自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 ); }
由于所有全局variables都是window
对象的属性,因此可以使用以下方法获取它们:
for(var key in window) { // all properties if(Array.isArray(window[key])) { // only arrays console.log(key, window[key]); // log key + value } }
由于所有默认/inheritance属性不是普通数组(主要是主机对象或函数),因此Array.isArray
检查就足够了。
以下函数仅转储已添加到窗口对象的全局variables:
(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来获得全局窗口variables的清单,然后将其与当前窗口中的全局variables列表进行比较。 它使用一个button,因为iframe是asynchronous运行的。 该代码使用全局variables,因为这使得代码更容易理解。
你可以看到它在这里或这里工作,但请注意,这些例子显示了许多由jsbin本身“泄漏”的全局variables(根据你使用的链接不同)。
要获得“全局”对象,你可以使用这个函数:
function globals() { return this; }
这是testing: http : //jsfiddle.net/EERuf/
window
是浏览器中的全局对象,您可以使用for..in
循环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] + '!'); } }
你可以使用叫做get-globals的 npm包。 它将window
属性与新创build的iframe
进行比较,只打印由dev(s)声明的variables,而不是浏览器供应商。
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();
要在控制台SCI.diff()
使用run来获取名称列表或SCI.diffObj()
来获取包含variables的对象