Regresar a la página www.ComoCrearTuWeb.com
Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 18

Tema: let y const JavaScript

  1. #1
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6

    let y const JavaScript

    Hola, estoy dándole caña al tema de let y const para declarar variables locales y constantes. Ya más o menos me defiendo pero con alguna dudilla todavía.

    En el ejemplo que pongo a continuación que saque de un ejemplo explicativo la ultima variable (var MY_FAV = 20;) da un error en la consola y la explicación que pone es porque este se alza en el contexto global. No comprendo que quiere decir, a mi entender la contante MY_FAV = 20 que es local no chocaría con var MY_FAV = 20; que es global y no debería dar un error: SyntaxError: tratando de redeclarar una constante. El identificador 'MY_FAV' ya ha sido declarado.

    <script>
    // definimos MY_FAV como constante y le damos un valor de 7
    const MY_FAV = 7;

    // es importante tener en cuenta como funciona el alcance de bloque
    if (MY_FAV === 7) {
    // esto esta bien y crea una variable MY_FAV de alcance/ambito de bloque
    // (funciona igual de bien con let para declarar un alcance de bloque /ambito de variable no-constante)
    const MY_FAV = 20;

    // MY_FAV ahora es 20
    console.log('my favorite number is ' + MY_FAV);

    // este se alza en el contexto global y lanza un error
    var MY_FAV = 20;
    }

    // MY_FAV todavia es 7
    console.log('my favorite number is ' + MY_FAV);
    </script>

  2. #2
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    22
    Hola!

    Lo que pasa es que no puedes tener dos variables con el mismo nombre dentro de un solo contexto/bloque:

    Código:
    if (MY_FAV === 7) {
    // esto esta bien y crea una variable MY_FAV de alcance/ambito de bloque
    // (funciona igual de bien con let para declarar un alcance de bloque /ambito de variable no-constante)
    const MY_FAV = 20; // Primera declaración; no hay problema.
    
    // MY_FAV ahora es 20
    console.log('my favorite number is ' + MY_FAV);
    
    // este se alza en el contexto global y lanza un error
    var MY_FAV = 20; // Segunda declaración dentro del mismo contexto.
    // No podrías cambiar el valor de MY_FAV de ninguna manera, pues la declaraste como const en el contexto global y el local.
    }
    Aquí MY_FAV aparece dos veces.

  3. #3
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Tienes razón, me di cuenta el otro día leyendo más sobre este asunto y vi que era por la redeclaración. Ni const ni let permite redeclarar una variable en el mismo ámbito lexico, ni tan quiera con var.
    Esto no era posible con ‘var’ y nos salvaguarda de redeclarar una variable accidentalmente.

  4. #4
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Una pregunta sobre este asunto.

    Cuando hablamos de contexto léxico, queremos decir al contexto entre llaves y ámbito del bloque. ¿ es todo lo mismo? es que nose si puedo estar confundiendo terminos.

  5. #5
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    22
    Si, es lo mismo. El contexto es todo a lo que tiene acceso la acción que está ejecutando el compilador (o intérprete) en un determinado momento (recuerda que el compilador o intérprete ejecutan las instrucciones una a una y de arriba hacia abajo).

  6. #6
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Redeclarar la misma variable dentro del alcance del bloque da SyntaxError.

    Pero si es todo lo mismo, contexto léxico, llaves y ámbito de bloque, porque en el primer ejemplo que te puse o este incluso que te pongo a continuación y que NO ESTA ENTRE LLAVES salta el SyntaxError por la redeclaración. Llaves=ámbito de bloque=ámbito léxico. Aquí no hay llaves.

    Imaginemos este ejemplo, un script sin llaves:

    <script>
    const MY_FAV = 7;
    var MY_FAV = 20;// // aquín también lanzara un SyntaxError por la redeclaración
    </script>

  7. #7
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Entiendo el tema de la redeclaracion. No voy por aquí ahora. De lo que hablo es del ámbito léxico, que si fuera lo mismo todo, Llaves=ámbito de bloque=ámbito léxico, el ejemplo que puse no sería un ámbito léxico donde están esas variables ya que no tiene llaves que las englobe.

    Algún artículo que me he leído dice que “el contexto léxico es aquel delimitado por llaves”. Espero haberme explicado.

  8. #8
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    22
    Hay que entender algo primero: el contexto léxico no existe en programación. Sí, se utiliza en el análisis léxico, pero no está directamente relacionado con lo que uno escribe como programador.

    Algún artículo que me he leído dice que “el contexto léxico es aquel delimitado por llaves”
    Si encontré lo mismo que leíste Tú, el autor dice:

    En realidad, lo que queremos decir con el contexto léxico es aquel delimitado por llaves en lugar de funciones...
    Por lo tanto también se referiría a lo mismo.

    Ahora, respecto al punto en cuestión. Si no existen llaves u otro delimitador, todo lo definido entra al contexto global (y por ende, las colisiones de nombres son más frecuentes).

  9. #9
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Hola de nuevo, sigo con este tema de ámbito de bloque en JavaScript y acabo de ver un ejemplo que no comprendo.

    Con const y let podemos declarar una variable de alcance de bloque({}), hasta aquí todo bien.

    Si echamos un vistazo sentencia block de JavaScript(adjunto abajo), veras que como dijimos const y let declara una variable de ámbito de bloque . Pero si vamos al ejemplo final también se puede ver que podemos limitar la declaración de una función dentro del bloque.

    https://developer.mozilla.org/en-US/...atements/block
    https://developer.mozilla.org/es/doc...ntencias/block

    ¿La declaración de una función puede tener un ámbito de bloque? Lo digo, porque lo que crea un ámbito de bloque no es la sentencia block en si ({}) sino, en este caso let y const. ¿Pero, function?

    Ejemplo:

    nacion('frances'); // TypeError: nacion no es una función
    {
    function nacion(nacionalidad) {
    console.log('Yo soy ' + nacionalidad);
    }
    nacion('español'); // correcto. logs Yo soy español
    }

  10. #10
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    22
    Lo digo, porque lo que crea un ámbito de bloque no es la sentencia block en si ({}) sino, en este caso let y const
    No, lo que crea el nuevo ámbito no son let/const/var (aunque var puede salir del ámbito donde se declaró), sino las llaves ({}):

    Código:
    var a = 'a'; // var puede ser reemplazado, en todos los ámbitos, por let o const.
    { // Ámbito 1
      var a = 'b';
      {  // Ámbito 2
        var a = 'c';
      }
    }
    alert('A = ' + a);
    ¿La declaración de una función puede tener un ámbito de bloque?
    Pues sí, jajaja. Tiene que ver con varias cosas, pero tal vez la más relevante sea el poder ocultar funciones al resto del mundo. Por ejemplo, el principio abierto/cerrado en programación orientada a objetos dice que:

    Un objeto debe estar abierto a extensiones y cerrado a las modificaciones
    Esto quiere decir que un objeto (entidad) no debe cambiar su forma de funcionar después de haber sido terminado. Si necesita una nueva característica, entonces se debe crear un nuevo objeto.

    Si se intenta seguir lo anterior, en JS, sin funciones de contexto local no podríamos hacerlo, pues no habría forma de limitar el acceso a los usuarios de las funciones que creamos:

    Código:
    function MiCadena() {
      function darVuelta(cadena) {
        let resultado = '';
        for(let i = cadena.length - 1; i >= 0; i--) {
          resultado += cadena[i];
        }
        return resultado;
      }
    
      return {
        voltear: darVuelta
      };
    }
    let miCadena = new MiCadena();
    alert(miCadena.voltear('Como Crear Tu Web'));
    La idea es ocultar lo que hay dentro de darVuelta, así, si modifico el código de darVuelta (puede que hayas encontrado un error, por ejemplo). También se evita que hayan alcances de nombres (que alguien más defina darVuelta en otro script y sobrescriba la mía o genere un error).

    Si alguien quisiera añadir una función similar, que volteara las palabras de la cadena en lugar de cada letra, entonces podría hacer esto (en otro script, incluido después del tuyo):

    Código:
    let miCadena2 = new MiCadena();
    miCadena2.voltear2 = function(cadena) {
    	let split = cadena.split(' ');
      return split.reverse().join(' ');
    };
    
    alert(miCadena2.voltear2('Como Crear Tu Web'));
    Una aclaración:

    El contexto está relacionado al objeto donde se ejecuta o al que pertenece el código del script. Usualmente esto es un objeto (incluso el contexto global o window, que es un objeto).
    El ámbito de una variable es el alcance que puede tener este (donde se puede "usar"). Hay dos ámbitos de estas: local o global. Las variables locales son todas aquellas definidas dentro de una función (anónima o no); el resto son globales.

    Espero que sirva de algo la explicación :).

  11. #11
    Recien Llegado! Merodeador
    Fecha de Ingreso
    10 mar, 18
    Mensajes
    5
    Poder de Reputación
    0
    The forum is very useful to help you a lot
    hotmail.com entrar

  12. #12
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    No, lo que crea el nuevo ámbito no son let/const/var (aunque var puede salir del ámbito donde se declaró), sino las llaves ({}):

    Código:
    var a = 'a'; // var puede ser reemplazado, en todos los ámbitos, por let o const.
    { // Ámbito 1
      var a = 'b';
      {  // Ámbito 2
        var a = 'c';
      }
    }
    alert('A = ' + a);
    No entiendo el ejemplo, es lo esperado. No veo que allá ningún ámbito de bloque aquí creado con la sentencia block({}). Ha cogido la variable a = 'c' por ser la última que se a sobrescrito de las tres.

    Pues sí, jajaja. Tiene que ver con varias cosas, pero tal vez la más relevante sea el poder ocultar funciones al resto del mundo.
    In other words, block statements do not introduce a scope.
    https://developer.mozilla.org/en-US/...atements/block

    Y lo demás no entendí nada lo siento. Algo más sencillo 

  13. #13
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    pd:

    Con let y const

    Por el contrario, las variables declaradas con let y const tienen alcance de bloque.

    let x = 1;
    {
    let x = 2;
    }
    console.log(x); // logs 1

    El alcance x = 2 es limitado solamente al bloque en el que está definido.

    Si x = 2 no fuera declarado con let sino con var logs no daría este resultado(al margen que sabemos que no se puede redeclarar una variable con let ni const). Aquí se demuestra que no son las llaves las que crean ese ámbito de bloque.

  14. #14
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    22
    In other words, block statements do not introduce a scope.
    Esto es así sólo con var, no con let/const.

    Aquí se demuestra que no son las llaves las que crean ese ámbito de bloque
    Tal vez estemos hablando de cosas distintas, pero una variable no puede tener declaraciones dentro de ella, por lo tanto tampoco puede crear un contexto o ámbito. Claro, uno puede definir una variable como un objeto donde definir funciones y otras variables, pero en ese caso sería el objeto el que define el contexto y las funciones el ámbito (lo que vaya dentro de los corchetes).

    De todas formas, como dice la documentación de MDN:

    ...you do not want to use standalone blocks in JavaScript, because they don't do what you think they do, if you think they do anything like such blocks in C or Java.
    ...no querrás usar bloques solitarios en JavaScript, porque no hacen lo crees que hacen, si piensas que hacen algo parecido a los bloques similares en C o Java.
    En otros lenguajes tienen sentido, aquí tal vez sirvan para ordenar el código, pero en ese caso sería mejor definir una función.

  15. #15
    Me va gustando esto... Habitante
    Fecha de Ingreso
    11 abr, 15
    Mensajes
    156
    Poder de Reputación
    6
    Esto es así sólo con var, no con let/const.
    Lo sé, lo dije yo desde el principio. Pero tú me dijiste:

    No, lo que crea el nuevo ámbito no son let/const/var (aunque var puede salir del ámbito donde se declaró), sino las llaves ({}):
    Se puede ver claramente que no son las llaves sino, let y const los que crean un ámbito de bloque entre las llaves. (Creo que estas confundiendo conceptos de java u otros lenguajes)

    Con const y let podemos declarar una variable de alcance de bloque({}).

    Tal vez estemos hablando de cosas distintas
    Creo que sí, que hablamos de cosas distintas. Yo hablo de JavaScript. En JavaScript el ámbito de bloque tal como dice Mozilla: “las sentencias block no incluyen ningún alcance”. Por el contrario, las variables declaradas con let y const tienen alcance de bloque. Pero me pones este ejemplo, que como te comente, no hay ningún ámbito de bloque, ya que var no crea ningún ámbito de bloque entre las llaves. Solo ámbito local a una función, es decir, las variables introducidas dentro de una sentencia block({}) tienen el alcance de la función que lo contiene.

    Tu ejemplo:

    var a = 'a'; // var puede ser reemplazado, en todos los ámbitos, por let o const.
    { // Ámbito 1
    var a = 'b';
    { // Ámbito 2
    var a = 'c';
    }
    }
    alert('A = ' + a);

    La duda mía que plante fue si ¿La declaración de una función puede tener un ámbito de bloque? Ya que como dije, lo que crea un ámbito de bloque no es la sentencia block en si ({}) sino, en este caso let y const. ¿Pero, function?

    Esta es la duda que tengo ¿funtion? como se puede ver en el ejemplo que había puesto de Mozilla, se está creando con function también ámbito de bloque y se puede ver con el ejemplo, que hace la llamada y le devuelve un TypeError. Investigando un poco, ya que veo poca cosa, creooo…que esto tiene que ver con la elevación (Hoisting) en conjunto con las llaves (no sé, no encuentro otra cosa) en las funciones. Ya que vuelvo a poner el mismo ejemplo de antes, y otro con la llamada a la función después de la declaración y se puede ver que ahora si hace la llamada.
    <script>
    nacion('frances'); // TypeError: nacion no es una función
    {
    function nacion(nacionalidad) {
    console.log('Yo soy ' + nacionalidad);
    }
    }
    </script>


    <script>
    {
    function nacion(nacionalidad) {
    console.log('Yo soy ' + nacionalidad);
    }
    }
    nacion('frances'); // TypeError: nacion no es una función

    </script>

    Conclusión:

    La declaración de una función por alguna razón tiene un alcance de bloque también como let y const. Pero ni idea del porqué.

Temas Similares

  1. Mas JavaScript porfas
    Por virtualcomo en el foro Foro General
    Respuestas: 0
    Último Mensaje: 25/01/2012, 21:29
  2. dar estilos a un javascript
    Por paxarin en el foro Scripts
    Respuestas: 9
    Último Mensaje: 25/01/2012, 16:17
  3. [TUTORIAL] Javascript ::SurKaiser:: Aprende Javascript!
    Por SurKaiser en el foro JavaScript
    Respuestas: 4
    Último Mensaje: 18/11/2011, 17:18
  4. PHP o JavaScript??
    Por SuperHipo en el foro Foro General
    Respuestas: 4
    Último Mensaje: 22/09/2011, 07:38
  5. LECCION 3, 4 Y 5 DE JAVASCRIPT
    Por B-A-S en el foro Tutoriales Varios
    Respuestas: 2
    Último Mensaje: 21/10/2008, 19:43

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •