¿Por qué no se puede acceder a variables de ámbito usando eval
bajo una declaración with
?¿Cómo es que eval no tiene acceso a las variables de ámbito bajo una declaración with?
Por ejemplo:
(function (obj) {
with (obj) {
console.log(a); // prints out obj.a
eval("console.log(a)"); // ReferenceError: a is not defined
}
})({ a: "hello" })
EDITAR: A medida que el conocimiento CMS señaló, esto parece ser un error del navegador (los navegadores que utilizan la consola WebKit).
Si alguien se preguntaba qué abominación estaba tratando de encontrar que requeriría tanto el "mal" eval
y with
- Estaba tratando de ver si podía obtener una función (utilizada como devolución de llamada) ejecutada en otro contexto en lugar de la que se definió en. Y no, I probablemente (tos) no utilizará esto en cualquier lugar .. más curioso que nada.
(function (context,fn) {
with (context)
eval("("+fn+")()");
})({ a: "hello there" }, function() { console.log(a); })
En qué navegador estás recibiendo este comportamiento? ¿Estás ejecutando el código en alguna consola? – CMS
@CMS: Chrome 5.0.375.125 beta utilizando la consola de desarrollador integrada. Editar: Acabo de probar esto con Firefox (Firebug) y funcionó como se esperaba. Debe ser un error del navegador como dijiste. –
@Daniel - Funciona correctamente en Chrome 6.0.472.22 si eso ayuda –