2011-01-31 14 views
20

Supongamos que hacemos algo como esto (como parte de la construcción de un objeto Javascript):¿Cómo inspeccionar variables de cierre vinculadas en javascript?

var foo = 3; 
this.method = function() { alert(foo); }; 

Ahora un cierre se generarán para asegurarse de foo es retenida y disponible para su uso en method. ¿Hay alguna manera de hacer una introspección en el cierre actual?

Lo que estoy buscando es una manera de enumerar todas las variables que están disponibles dentro de method, que debe incluir foo. El código de depuración como este sería de gran ayuda en la depuración de la vinculación de los cierres, pero aún no lo he encontrado. ¿Es posible hacer esto?

Respuesta

10

El idioma en sí no contiene tales posibilidades. De hecho, los datos ocultos en los cierres de JavaScript son una de las pocas cosas que en realidad son realmente privadas (en oposición a los datos "privados" en C#, C++, Java, etc., que siempre se puede acceder con magia o reflexión del puntero).

En resumen, esto sería algo del compilador. Lo que podría esperar es una herramienta integrada en uno de los principales intérpretes de JavaScript (o al menos capacidad incorporada para conectar dicha herramienta en el motor central). Uno en Firefox/Firebug o V8/Node.js estaría bien, pero creo que no tenemos suerte en este momento.

7

Desde 1.11.2, la línea de comandos de Firebug incluye una extensión de sintaxis para obtener el valor de foo: this.method.%foo.

El cierre completo también se puede inspeccionar, activando la opción "Mostrar cierres" en el panel DOM y expandiendo la pseudo-propiedad "(cierre)" de this.method. Esto también funciona en Chrome (allí la pseudo-propiedad se llama <function scope>; no hay pref para ella).

0

Quizás JavaScript no lo implemente por defecto, pero puedo imaginar una manera de leer todas las propiedades del objeto global (como foo es una propiedad de él) y leer cada propiedad hasta llegar al cierre, aunque esto sería realmente lento . Debo decir que no sé mucho sobre javascript y tal vez estoy diciendo nocencias, pero tal vez se obtiene una nueva idea de mi enfoque.

+1

Si 'foo' es una variable local (tal vez el ejemplo del OP está dentro de un constructor), no será accesible desde el objeto global. – dpercy