El problema con declarar con var
en el encabezado de bucle es que es engañoso. Se ve como que está declarando una variable cuyo alcance se limita al bucle for
, cuando en realidad existe en todas partes dentro de la función - incluyendo antes de la declaración:
var i = 1;
function foo() {
console.log(i); // 'undefined'
for (var i=1; i<100; ++i) {
}
}
A pesar de que la llamada console.log
ocurre antes la declaración del i
local, todavía está en el alcance porque está dentro de la misma función. Por lo tanto, el i
local, que aún no tiene ningún valor asignado, pasa a log
. Esto puede ser sorprendente; ciertamente no es obvio para cualquiera que no esté familiarizado con las reglas de alcance de Javascript.
A partir de ECMAScript 2015, existe una forma mejor de declarar las variables: let
. Las variables declaradas con let
son locales al bloque que las contiene, no a toda la función. Por lo que esta versión del código anterior imprimir 1
según lo previsto:
let i=1; // could use var here; no practical difference at outermost scope
function foo() {
console.log(i); // 1
for (let i=1; i<100; ++i) {
}
}
así que las mejores prácticas en Javascript moderna es para declarar variables con let
en lugar de var
. Sin embargo, si está atrapado con una implementación anterior a ECMAScript 2015, es un poco menos confuso declarar todas las variables en la parte superior de la función, en lugar de esperar hasta el primer uso.
Posible duplicado de [las variables de JavaScript declaran bucle externo o interno?] (Http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –