-
Ahora que has dominado los fundamentos de las funciones, quiero hablar de un tema que puede ser un poco complicado: la diferencia entre variables locales y globales.
-
Puede ser que por ahora estos términos no signifiquen nada para ti. Así que empecemos con un ejemplo.
-
Escribí este programa para mostrarte cuántas pulgadas crecí en mi infancia.
-
Dado que los seres humanos crecen a ritmos diferentes, se me ocurrió esta función, "calcInches",
-
donde puedo pasarle una "startAge" (edad inicial), una "endAge" (edad final), y una "inchesPerYear" (pulgadas por año),
-
y luego la función calculará cuántas pulgadas crecí durante ese tiempo.
-
... y regresará el resultado a quien haya llamado la función.
-
Entonces puedes ver aquí desde 0 hasta 8 años, llamo la función "calcInches" y le paso 0, 8 y 2.5,
-
porque crecí alrededor de 2.5 pulgadas por año.
-
Hace el cálculo y como puedes ver, arroja 20.
-
Luego desde 8 hasta 16, llamo la función y paso 8, 16 y luego 2.
-
Porque no crecí tanto, y puedes ver que arroja un resultado de 16.
-
Esto se ve muy bien pero ahora quiero mostrar en realidad cuántas pulgadas crecí en total en toda mi infancia.
-
Así que ¿cómo hago eso? Bueno podría empezar por mirar mi código y decir mmm..., ¿qué valores tengo aquí?
-
¿Tengo alguna cosa que parezca representar el total de pulgadas?
-
Bueno, tengo esta variable "totalInches" (pulgadas totales) dentro de mi función "calcInches",
-
Así que podría desplegar eso y ver qué dice; podría empezar por ahí.
-
Digamos entonces "text(totalInches, 10, 200)" y lo ponemos aquí abajo.
-
Muy bien, vamos a ver qué obtenemos con esto. Oh, o-oh, obtuvimos al chico de los ¡Oh no! Y dice que hay un problema.
-
"totalInches" no está definida. Bueno, eso es extraño porque definimos "totalInches" justo aquí, ¿cierto? "var totalInches =".
-
Bueno, el problema es que declaramos "totalInches" dentro de una función. En esta línea de aquí.
-
Y cuando definimos una variable dentro de una función, es considerada como una variable local.
-
Sólo es válida dentro de esta función (calcInches).
-
Y el código que está fuera de la función, todo esto, no ve las variables locales que están dentro de las funciones.
-
Sólo ve lo que le regresan.
-
Sólo ve ese valor, no esa variable.
-
Así que cuando tratamos de usar "totalInches" fuera de la función, el programa no sabe qué es eso,
-
Y dice: "Hey, no he visto esta variable antes. No está definida. No puedo desplegarla."
-
Entonces hay una manera en que podemos hacer que el código que está fuera de la función pueda ver esta variable.
-
Y es cambiando esta variable local en una variable global.
-
Podemos hacer eso moviendo la definición de la variable fuera de la función, en lo que se llama el entorno global.
-
Y ahora, dentro de la función, todo lo que estamos haciendo es cambiar su valor cada vez, no definiéndola ni declarándola.
-
Así que podemos ver que aquí dice "Total grown over life: 16" (Crecimiento total en la vida: 16)
-
Entonces el programa encontró la variable porque la hicimos variable global.
-
Pero este no es el valor que estamos buscando en realidad.
-
Es sólo el valor más reciente.
-
Y eso es porque cada vez que llamamos esta función, se asigna a "totalInches" el último resultado calculado, ¿correcto?
-
Entonces lo que realmente necesitamos hacer es un nueva variable
-
que usemos solamente para almacenar el total que se vaya sumando cada vez que calculamos ... el total para un rango.
-
Así que vamos a cambiar otra vez esta variable para hacerla local, y hacer una nueva variable global que llamaremos "lifeInches".
-
Y la inicializamos en 0.
-
Y luego dentro de la función, sumaremos a esta variable global "lifeInches += totalInches".
-
Así que vamos a sumar lo que calculemos cada vez que llamamos esta función,
-
lo vamos a sumar a la variable global "lifeInches".
-
Y luego en la parte de abajo, desplegaremos la variable lifeInches: "text(lifeInches, 10, 200)".
-
¡Tan tan! nuestro crecimiento total en la vida.
-
En realidad esta no es mi estatura. Soy más alta que eso.
-
Pero eso es porque cuando nacemos medimos más de 0 pulgadas.
-
Así que si quiero el total, podría comenzar en 20.
-
Y eso es todo, ésta es mi estatura.
-
Muy bien. Revisemos, "totalInches" es lo que llamamos una variable local.
-
Y sabemos eso porque vemos que la declaración de la variable está dentro de la función, y no fuera de la función.
-
Y eso significa que el código que está aquí afuera de la función no reconoce esta variable llamada "totalInches".
-
Ahora, "lifeInches" es lo que llamamos una variable global.
-
Y sabemos eso porque vemos que la declaración de esta variable está fuera de cualquier función, en nuestro entorno global.
-
Así que trata de tener esto en mente cuando escribas tus funciones y tus variables.
-
Y piensa si quieres tener una variable local para usar en una función,
-
o una variable global para usar en todo el programa.
-
Y no te preocupes si te cuesta trabajo.
-
Es uno de los conceptos más difíciles de la programación, en JavaScript en particular.
-
Y es algo que harás mejor mientras más lo practiques.