Подтвердить что ты не робот

Javascript - сброс всех глобальных переменных

Есть ли способ в Javascript получить список или выгрузить содержимое всех глобальных переменных, объявленных Javascript/jQuery script на странице? Меня особенно интересуют массивы. Если я могу получить имена массивов, мне будет достаточно. Наблюдение его значений - это бонус.

4b9b3361

Ответ 1

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 );
}

Ответ 2

Поскольку все глобальные переменные являются свойствами объекта 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 достаточна.

Ответ 3

Следующая функция только сбрасывает глобальные переменные, которые были добавлены в объект окна:

(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 (разные в зависимости от того, какую ссылку вы используете).

Ответ 4

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] + '!');
    }
}

Ответ 5

Чтобы получить объект "globals", вы можете использовать эту функцию:

function globals() { return this; }

Вот тест: http://jsfiddle.net/EERuf/

Ответ 6

Вы можете использовать пакет npm, называемый get-globals. Он сравнивает свойства window со свежим созданным iframe для печати только переменных, объявленных разработчиками (dev), а не поставщика браузера.

Ответ 7

Greasymonkey script, чтобы получить утечку глобальных переменных

// ==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(), чтобы получить список имен или SCI.diffObj(), чтобы получить объект с переменными