Javascript-сброс всех глобальных переменных
Есть ли в Javascript способ получить список или сбросить содержимое всех глобальных переменных, объявленных скриптом Javascript/jQuery на странице? Меня особенно интересуют массивы. Если я смогу получить имена массивов, мне этого будет достаточно. Видеть его ценности-это бонус.
7 ответов:
Это даст вам массив всехперечислимых свойств объекта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, их можно получить с помощью:Поскольку все свойства по умолчанию / унаследованные свойства не являются простыми массивами (в основном это объекты или функции хоста), проверка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:
(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 (разные в зависимости от того, какую ссылку вы используете).
Для получения объекта "глобалы" можно использовать следующую функцию:
function globals() { return this; }Вот тест: http://jsfiddle.net/EERuf/
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] + '!'); } }
Вы можете использовать пакет npm под названием get-globals. Он сравнивает свойства
windowсо свежесозданнымиiframe, чтобы печатать только переменные, объявленные dev(S), а не поставщиком браузера.
Скрипт 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();Использовать run in console
SCI.diff()для получения списка имен илиSCI.diffObj()для получения объекта с переменными
Comments