ti-enxame.com

Javascript - eliminando todas as opções globais

Existe uma maneira em JavaScript para obter uma lista ou despejar o conteúdo de todas as variáveis ​​globais declaradas pelo script javascript/jQuery em uma página? Estou particularmente interessado em matrizes. Se eu conseguir os nomes das matrizes, será o suficiente para mim. Ver seus valores é um bônus.

36
SpaceDog
Object.keys( window );

Isto lhe dará uma matriz de todas as propriedades enumeráveis do objeto window (que são variáveis ​​globais).

Para navegadores mais antigos, inclua o patch de compatibilidade do MDN .


Para ver seus valores, é claro que você desejará apenas um enumerador típico, como for-in.


Você deve notar que mencionei que esses métodos só lhe darãoenumerableproperties. Normalmente, esses serão aqueles que não são incorporados pelo ambiente.

É possível adicionar propriedades não enumeráveis em navegadores compatíveis com ES5. Eles não serão incluídos em Object.keys ou ao usar uma instrução for-in.


Conforme observado por @Raynos , você pode Object.getOwnPropertyNames( window ) para não-enumeráveis. Eu não sabia disso. Obrigado @Raynos!

Então, para ver os valores que incluem enumeráveis, você gostaria de fazer isso:

var keys = Object.getOwnPropertyNames( window ),
    value;

for( var i = 0; i < keys.length; ++i ) {
    value = window[ keys[ i ] ];
    console.log( value );
}
42
RightSaidFred

A função a seguir apenas despeja variáveis ​​globais que foram adicionadas ao objeto da janela:

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

Ele funciona usando um iframe para obter uma lista limpa de variáveis ​​de janela globais e comparando com a lista de variáveis ​​globais na janela atual. Ele usa um botão porque o iframe é executado de forma assíncrona. O código usa uma variável global porque isso torna o código mais fácil de entender.

Você pode vê-lo funcionando aqui ou aqui , embora note que estes exemplos mostram muitas variáveis ​​globais "vazadas" pelo próprio jsbin (diferente dependendo de qual link você usa).

4
robocat

Como todas as variáveis ​​globais são propriedades do objeto window, você pode obtê-las usando:

for(var key in window) { // all properties
    if(Array.isArray(window[key])) { // only arrays
        console.log(key, window[key]); // log key + value
    }
}

Como todas as propriedades padrão/herdadas não são matrizes simples (principalmente objetos Host ou funções), a verificação Array.isArray é suficiente.

3
pimvdb

window é o objeto global em um navegador e você pode usar um loop for..in para percorrer suas propriedades:

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

Para obter o objeto "globals", você pode usar esta função:

function globals() { return this; }

Aqui está o teste: http://jsfiddle.net/EERuf/

1
c-smile

Você pode usar o pacote npm chamado get-globals . Ele compara as propriedades de window com iframe recém-criada para imprimir apenas variáveis ​​declaradas por dev (s), não como fornecedor de navegador.

0
Remek Ambroziak