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



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

507   7  

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

    Ничего не найдено.