Alessandra Salvaggio

JavaScript: Guía completa


Скачать книгу

y media. Observa que están definidas en el punto en el que se utilizan: suma inmediatamente antes del bucle for del cálculo de la suma, indice dentro del bucle for y media después de que se ha calculado la suma.

      La definición de variables en el punto en que se utilizan la primera vez es común a muchos otros lenguajes de programación.

      Sin embargo, JavaScript, a diferencia de otros lenguajes, tiene un comportamiento peculiar (el término técnico es hoisting): las instrucciones var dentro de una función se ejecutan antes que todas las otras, sea donde sea que se encuentren en la función.

      Para demostrar este efecto, añadimos a nuestra función una línea que escribe en la consola del navegador el valor de la variable media antes que la línea que la define:

      var suma = 0;console.log(`media = ${media}`)for (var indice = 0; indice < numeros.length; indice += 1) {suma += numeros[indice];}var media = suma / numeros.length;

      Pensaríamos que se produciría un error durante la ejecución, dado que utilizamos la variable media antes que su definición.

      En lugar de eso, en la consola podemos ver:

      media = undefined

      (o media = "", según el navegador que se utilice)

      Este mensaje significa que la variable media existe, pero que por el momento no tiene ningún valor. Esto se produce porque, de hecho, JavaScript, en fase de ejecución, reorganiza el código de esta manera:

      function mediaConVar1bis(numeros) {var suma;var indice;var media;suma = 0;for (indice = 0; indice < numeros.length; indice += 1) {suma += numeros[indice];}media = suma / numeros.length;return `Los ${numeros.length} números tienen suma=${somma} y media=${media}. El índice es ${indice}`;}

      donde todas las variables se definen al inicio de la función, pero no se les asigna un valor de inmediato.

      Este comportamiento puede llevar a engaño incluso a los más expertos, puesto que se sugiere siempre definir explícitamente las variables al inicio de la función para que se vea que, efectivamente, es JavaScript quien gestiona el código:

      function mediaConVar2(numeros) {var suma = 0, indice, media;for (indice = 0; indice < numeros.length; indice += 1) {suma += numeros[indice];}media = suma / numeros.length;return `Los ${numeros.length} números tienen suma=${suma} y media=${media}. El índice es ${indice}`;}

      En el ejemplo, para crear un código más simplificado, hemos agrupado las definiciones en una única instrucción var (las variables separadas por comas) y hemos inicializado (mediante asignación), donde es necesario, el valor (suma = 0).

      De este modo, con todas las variables al inicio, no es posible engañarse y utilizar una variable antes de que sea definida.

      La solución de definir todas las variables al inicio, sin embargo, no es demasiado elegante y son pocos los lenguajes de programación que aconsejan o imponen esta práctica.

      De hecho, esta puede causar errores en el código, dado que aleja el punto en que se define la variable del punto en que se utiliza y es más difícil mantener bajo control su gestión de forma correcta, sobre todo cuando el código es largo y complejo.

      Así, en ECMAScript 6 (2015), para evidenciar este problema, se introdujo la instrucción let, que obliga a JavaScript a comportarse de una forma más parecida a los otros lenguajes: así se evita el hoisting, las variables se definen en el momento de la instrucción en que están creadas, no existen antes (por lo que no pueden ser utilizadas antes) y, si la definición se produce dentro de un bloque (entre dos {}), la variable no existe fuera de él.

NOTARecuerda que hemos dicho que el área de validez de let es el bloque, mientras que la de var es la función.

      Si utilizamos let, la función propuesta se convierte en:

      function mediaConLet(numeros) {let suma = 0;for (let indice = 0; indice < numeros.length; indice += 1) {suma += numeros[indice];}let media = suma / numeros.length;return `Los ${numeros.length} números tiene suma=${suma} y media=${media}. El índice es ${indice}`;}

       Puedes encontrar este ejemplo en el archivo Scope2 .html

      Si intentamos ejecutar esta función se producirá un error (visible en la consola del navegador) que indica que, en la instrucción de return, se utiliza una variable, indice, no definida.

      De hecho, la variable indice, definida con let, existe solo dentro del bucle for (su área de validez es el bucle for).

      Por lo tanto, debemos eliminar la lectura de la variable indice o definirla justo antes del bucle for (sin embargo, por norma general, las variables utilizadas como índice de un bucle no tienen ninguna utilidad fuera del bucle mismo):

      return `Los ${numeros.length} números tienen suma=${suma} y media=${media}`;

      Incluso si añadimos la línea:

      console.log(`media = ${media}`)

      antes del ciclo for se producirá un error, esta vez determinado por el intento de acceder a la variable media antes de su definición.

      Конец ознакомительного фрагмента.

      Текст предоставлен ООО «ЛитРес».

      Прочитайте эту книгу целиком, купив полную легальную версию на ЛитРес.

      Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.

/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QQTaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl aGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4 OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6 NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5 OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHht bG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0i aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1w PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3Jn L2RjL2VsZW1lbnRzLzEuMS8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUQwM0U3MTY5NDBB MTFFOTg2RUU5MTU1OTYwNTY0ODQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUQwM0U3MTU5 NDBBMTFFOTg2RUU5MTU1OTYwNTY0ODQiIHhtcDpDcmVhdG9yVG9vbD0iUFNjcmlwdDUuZGxsIFZl cnNpb24gNS4yLjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlp ZDpDQzQ2QUNEOTMzNjcxMUU5ODM5NUM0RUE5QjBENDYxNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1w LmRpZDpDQzQ2QUNEQTMzNjcxMUU5ODM5NUM0RUE5QjBENDYxNiIvPiA8ZGM6Y3JlYXRvcj4gPHJk ZjpTZXE+IDxyZGY6bGk+bGxkdXJfMDAwPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC9kYzpjcmVhdG9y PiA8ZGM6dGl0bGU+IDxyZGY6QWx0PiA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkNvYmVy dGFfSmF2YXNjcmlwdF9TYWx2YWdnaW8uaW5kZDwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0 bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQg ZW5kPSJyIj8+/+0ASFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAPHAFaAAMbJUccAgAAAgACADhC SU0EJQAAAAAAEPzhH4nIt8l4LzRiNAdYd+v/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUG CQYFBgkLCAYG