Existe uma maneira de obter todas as variáveis que estão atualmente no escopo em javascript?
javascript
Ian
fonte
fonte
for (v in this) alert(v);
. Porém, nem todas as globais são enumeráveis, e eu não conheço nenhuma maneira padrão de obter uma lista das não enumeráveis.this
,arguments
, parâmetros e todas as variáveis definidas no abrangendo os escopos.Respostas:
Não. As variáveis "no escopo" são determinadas pela "cadeia de escopo", que não é acessível programaticamente.
Para detalhes (muitos deles), consulte a especificação ECMAScript (JavaScript). Aqui está um link para a página oficial, onde você pode baixar a especificação canônica (um PDF), e aqui está um para a versão HTML linkável oficial.
Atualização com base no seu comentário para Camsoft
As variáveis no escopo da sua função de evento são determinadas por onde você define sua função de evento, não como elas a chamam.Porém , você pode encontrar informações úteis sobre o que está disponível para sua função por meio de
this
argumentos, fazendo algo como o KennyTM apontou (for (var propName in ____)
), pois isso informará o que está disponível em vários objetos fornecidos a você (this
e argumentos; se você estiver sem saber quais argumentos eles fornecem, você pode descobrir através daarguments
variável definida implicitamente para cada função).Portanto, além do que estiver no escopo por causa de onde você define sua função, você pode descobrir o que mais está disponível por outros meios, fazendo:
(Você pode expandir isso para obter informações mais úteis.)
Em vez disso, eu provavelmente usaria um depurador como as ferramentas de desenvolvimento do Chrome (mesmo que você normalmente não use o Chrome para desenvolvimento) ou o Firebug (mesmo que você normalmente não use o Firefox para o desenvolvimento) ou o Dragonfly on Opera ou "F12 Developer Tools" no IE. E leia os arquivos JavaScript que eles fornecem. E bata na cabeça deles para documentos adequados. :-)
fonte
Embora todos respondam " Não " e eu saiba que "Não" é a resposta certa, mas se você realmente precisar obter variáveis locais de uma função, existe uma maneira restrita.
Considere esta função:
Você pode converter sua função em uma string:
Você obterá a fonte da função como uma string
Agora você pode usar um analisador como o esprima para analisar o código de função e encontrar declarações de variáveis locais.
e encontre objetos com:
no resultado (removi
console.log(x)
abaixo):Eu testei isso no Chrome, Firefox e Node.
Mas o problema com esse método é que você apenas tem as variáveis definidas na própria função. Por exemplo, para este:
você apenas tem acesso ao x e não ao y . Mas ainda assim você pode usar cadeias de chamador (argumentos.callee.caller.caller.caller) em um loop para encontrar variáveis locais das funções de chamador. Se você tiver todos os nomes de variáveis locais, terá variáveis de escopo . Com os nomes das variáveis, você tem acesso aos valores com uma avaliação simples.
fonte
function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);
Ela imprimeundefined
enquanto eu esperava que deve ser 2.Sim e não. "Não" em quase todas as situações. "Sim", mas apenas de maneira limitada, se você quiser verificar o escopo global. Veja o seguinte exemplo:
Que gera, entre mais de 150 outras coisas , o seguinte:
Portanto, é possível listar algumas variáveis no escopo atual, mas não é confiável, sucinto, eficiente ou facilmente acessível.
Uma pergunta melhor é por que você quer saber quais variáveis estão no escopo?
fonte
for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}
. Isso reduzirá pelo menos as propriedades herdadas e suas variáveis estarão entre apenas cerca de 50 outras propriedades.No ECMAScript 6, é mais ou menos possível envolvendo o código dentro de uma
with
instrução com um objeto proxy. Observe que isso requer um modo não estrito e é uma prática ruim.O proxy afirma possuir todos os identificadores mencionados dentro
with
, para que as atribuições de variáveis sejam armazenadas no destino. Para pesquisas, o proxy recupera o valor do destino do proxy ou do objeto global (não no escopo pai).let
econst
variáveis não estão incluídas.Inspirado por esta resposta de Bergi .
fonte
Você não pode.
Variáveis, identificadores de declarações de funções e argumentos para código de função, são vinculados como propriedades do objeto variável , o que não é acessível.
Veja também:
fonte
with
instrução possa ser usada para inserir outros objetos na cadeia).A maneira mais simples de obter acesso a Vars em um escopo específico
Nota: Você deseja fazer isso em js não minificados.
A maneira mais simples de mostrar todos os Vars não privados
Agora você verá uma árvore de objetos que pode ser expandida com todos os objetos declarados.
fonte
Como todo mundo percebeu: você não pode. Mas você pode criar um objeto e atribuir todos os var que você declara a esse objeto. Dessa forma, você pode facilmente verificar seus vars:
fonte
console.log(window);
jsfiddle.net/4x3TxEu fiz um violino implementando (essencialmente) as idéias delineadas por iman. Aqui está como fica quando você passa o mouse sobre o segundo ipsum
return ipsum*ipsum - ...
As variáveis que estão no escopo são destacadas onde são declaradas (com cores diferentes para diferentes escopos). o
lorem
borda com vermelho é uma variável sombreada (não está no escopo, mas esteja no escopo se o outro lorem mais abaixo da árvore não estiver lá.)Estou usando a biblioteca esprima para analisar o JavaScript e estraverse, escodegen, escope (bibliotecas de utilidade em cima da esprima.) O 'trabalho pesado' é feito por todas essas bibliotecas (a mais complexa é a própria esprima, é claro).
Como funciona
cria a árvore de sintaxe abstrata. Então,
gera uma estrutura de dados complexa que encapsula informações sobre todos os escopos no programa. O restante está reunindo as informações codificadas nesse objeto de análise (e a própria árvore de sintaxe abstrata) e criando um esquema de cores interativo.
Portanto, a resposta correta não é realmente "não", mas "sim, mas". O "mas" é grande: você basicamente tem que reescrever partes significativas do navegador chrome (e suas devtools) em JavaScript. JavaScript é uma linguagem completa de Turing, portanto é claro que isso é possível, em princípio. O que é impossível é fazer a coisa toda sem usar todo o seu código-fonte (como uma string) e depois fazer coisas altamente complexas com isso.
fonte
Se você quiser apenas inspecionar as variáveis manualmente para ajudar na depuração, inicie o depurador:
debugger;
Diretamente no console do navegador.
fonte