Me he encontrado con un problema muy extraño (para mí) con la palabra clave var
. Lo reduje a un caso de prueba bastante mínimo, y encontré que se exhibió en Node.js (por lo tanto, V8 y Chrome), el inspector de Safari 4 (por lo tanto, Nitro) y FireBug (obviamente, SpiderMonkey). Originalmente estaba preparando un informe de fallas, pero dado que se muestra de manera tan amplia, supongo que no entiendo completamente cómo se supone que JavaScript debe abarcar y buscar variables.Operación confusa de la palabra clave `var` de JavaScript
El caso de prueba es muy pequeño, y en GitHub aquí: http://gist.github.com/260067. La única diferencia entre el primer y el segundo ejemplo es la inclusión de la palabra clave var
.
Aquí, también, es un caso de prueba similar que presenta el mismo 'problema' de una manera diferente: https://gist.github.com/698b977ee0de2f0ee54a
Editar: necesidad, para evitar más respuestas que intentan explicar cómo funciona el alcance en cascada, I' Estoy íntimamente familiarizado con eso. Mi problema, es que no entiendo por qué el siguiente código 'funciona' (en el que alert()
s 'exterior', seguido de 'interior', y luego otra vez 'exterior'):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
El var foo;
ocurre en una posición completamente irrelevante para la reasignación de foo
; Entonces, ¿por qué afecta esa tarea de una manera muy sustancial?
¿Por qué está utilizando una evaluación? No hay absolutamente ninguna razón para usar eval en el código que ha publicado. – Marius
Para demostrar el problema. La implementación real es muy diferente; Puedes verlo en la naturaleza aquí: http://github.com/elliottcable/poopy.js/blob/new-acquire/lib/from.js#L193 – ELLIOTTCABLE
Tu último ejemplo funciona porque 1) foo = 'inner'; asigna el valor al ámbito padre foo, al que tiene acceso esta función. 2) no necesita usar var para declarar una variable. – Marius