¿Hay alguna manera de obtener todas las variables que están actualmente en alcance en JavaScript?
javascript
Ian
fuente
fuente
for (v in this) alert(v);
. Sin embargo, no todos los globales son enumerables, y no conozco ninguna forma estándar de obtener una lista de los no enumerables.this
,arguments
, parámetros y todas las variables definidas en ámbitos que encierra.Respuestas:
No. Las variables "en alcance" están determinadas por la "cadena de alcance", que no es accesible mediante programación.
Para obtener detalles (bastante), consulte la especificación ECMAScript (JavaScript). Aquí hay un enlace a la página oficial donde puede descargar la especificación canónica (un PDF), y aquí está uno a la versión HTML oficial y enlazable.
Actualización basada en tu comentario a Camsoft
Las variables en el alcance de su función de evento están determinadas por dónde define su función de evento, no cómo lo llaman. Pero , puede encontrar información útil sobre lo que está disponible para su función a través de
this
y argumentos haciendo algo similar a lo que KennyTM señaló (for (var propName in ____)
) ya que eso le dirá lo que está disponible en varios objetos que se le proporcionan (this
y argumentos; si está no estoy seguro de qué argumentos te dan, puedes averiguarlo a través de laarguments
variable que está implícitamente definida para cada función).Entonces, además de lo que esté dentro del alcance debido a dónde define su función, puede descubrir qué más está disponible por otros medios haciendo:
(Puede ampliar eso para obtener más información útil).
Sin embargo, en lugar de eso, probablemente usaría un depurador como las herramientas de desarrollo de Chrome (incluso si normalmente no usa Chrome para el desarrollo) o Firebug (incluso si normalmente no usa Firefox para el desarrollo) o Dragonfly en Opera o "Herramientas de desarrollo F12" en IE. Y lea los archivos JavaScript que le proporcionen. Y golpéalos en la cabeza para obtener los documentos adecuados. :-)
fuente
Aunque todos responden " No " y sé que "No" es la respuesta correcta, pero si realmente necesita obtener variables locales de una función, hay una forma restringida.
Considere esta función:
Puede convertir su función en una cadena:
Obtendrá fuente de función como una cadena
Ahora puede usar un analizador como esprima para analizar el código de función y encontrar declaraciones de variables locales.
y encontrar objetos con:
en el resultado (he eliminado a
console.log(x)
continuación):He probado esto en Chrome, Firefox y Node.
Pero el problema con este método es que solo tiene las variables definidas en la función misma. Por ejemplo para este:
solo tienes acceso a la xy no a la y . Pero aún puede usar cadenas de llamador (argumentos.callee.caller.caller.caller) en un bucle para encontrar variables locales de las funciones del llamador. Si tiene todos los nombres de variables locales, entonces tiene variables de alcance . Con los nombres de las variables tiene acceso a los valores con una evaluación simple.
fuente
function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);
Se imprimeundefined
mientras espero que sea 2.Si y no. "No" en casi todas las situaciones. "Sí", pero solo de manera limitada, si desea verificar el alcance global. Tome el siguiente ejemplo:
Lo que genera, entre más de 150 cosas , lo siguiente:
Por lo tanto, es posible enumerar algunas variables en el alcance actual, pero no es confiable, sucinto, eficiente o de fácil acceso.
Una mejor pregunta es ¿por qué quieres saber qué variables están dentro del alcance?
fuente
for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}
. Esto al menos reducirá las propiedades heredadas y sus variables estarán entre solo unas 50 propiedades más.En ECMAScript 6 es más o menos posible envolviendo el código dentro de una
with
declaración con un objeto proxy. Tenga en cuenta que requiere un modo no estricto y es una mala práctica.El proxy afirma poseer todos los identificadores a los que se hace referencia en el interior
with
, por lo que las asignaciones de variables se almacenan en el destino. Para las búsquedas, el proxy recupera el valor del objetivo del proxy o del objeto global (no el ámbito principal).let
y lasconst
variables no están incluidas.Inspirado por esta respuesta de Bergi .
fuente
No puedes
Las variables, los identificadores de las declaraciones de funciones y los argumentos para el código de función, están vinculados como propiedades del Objeto Variable , que no es accesible.
Ver también:
fuente
with
instrucción se puede usar para insertar otros objetos en la cadena).La forma más sencilla de obtener acceso a Vars en un ámbito particular
Nota: Desea hacer esto contra js no minificados.
La forma más sencilla de mostrar todos los Vars no privados
Ahora verá un árbol de objetos que puede expandir con todos los objetos declarados.
fuente
Como todos notaron: no puedes. Pero puede crear un obj y asignar cada var que declare a ese obj. De esa manera, puede ver fácilmente sus variables:
fuente
console.log(window);
jsfiddle.net/4x3TxHice un violín implementando (esencialmente) las ideas anteriores esbozadas por iman. Así es como se ve cuando pasa el mouse sobre el segundo ipsum en
return ipsum*ipsum - ...
Las variables que están en el alcance se resaltan donde se declaran (con diferentes colores para diferentes ámbitos). El
lorem
borde rojo es una variable sombreada (no está dentro del alcance, pero esté dentro del alcance si el otro lorem más abajo del árbol no estaría allí).Estoy usando la biblioteca esprima para analizar JavaScript, y estraverse, escodegen, escope (bibliotecas de servicios además de esprima). El 'trabajo pesado' lo realizan todas esas bibliotecas (la más compleja es la propia esprima, por supuesto).
Cómo funciona
hace el árbol de sintaxis abstracta. Luego,
genera una estructura de datos compleja que encapsula información sobre todos los ámbitos del programa. El resto es reunir la información codificada en ese objeto de análisis (y el árbol de sintaxis abstracta en sí), y crear un esquema de coloración interactivo.
Entonces, la respuesta correcta en realidad no es "no", sino "sí, pero". El "pero" es importante: básicamente tienes que reescribir partes significativas del navegador Chrome (y sus herramientas de desarrollo) en JavaScript. JavaScript es un lenguaje completo de Turing, por lo que es posible, en principio. Lo que es imposible es hacer todo sin usar la totalidad de su código fuente (como una cadena) y luego hacer cosas muy complejas con eso.
fuente
Si solo desea inspeccionar las variables manualmente para ayudar a la depuración, simplemente inicie el depurador:
debugger;
Directamente en la consola del navegador.
fuente