Puntos de conocimiento sobre dejar que no sepas - notas del libro Ruby

La diferencia entre let y var

Todo el mundo puede saber la diferencia entre let y var. Los puntos principales son los siguientes:

1. var no tiene alcance a nivel de bloque (pero tiene alcance de función), mientras que let tiene alcance a nivel de bloque.

2. Hay promoción variable en var , pero no hay promoción variable en let.

3. var puede declarar variables con el mismo nombre , pero let no puede declarar variables con el mismo nombre.

dejar declaración en bucle for

1. Resolver las deficiencias del recorrido del bucle penetrando hacia el exterior.

Mire las siguientes dos piezas de código:

        for(var i = 0; i < 5; i++){
            console.log('--------');
        }
        console.log(i);// 5

La salida i de este código es 5, porque la variable declarada por var no tiene alcance de bloque.

        for(let i = 0; i < 5; i++){
            console.log('--------');
        }
        console.log(i); // ReferenceError: i is not defined

Este código da como resultado un ReferenceError porque la variable declarada por let tiene alcance de bloque.

La razón para decir esto es que cuando use bucles for en el futuro, intente usar let para declarar variables de bucle, porque accidentalmente puede usar var para declarar la misma variable en ambos bucles al escribir código en el futuro, por lo que el primero El ¡Es probable que dos bucles for se vean afectados!

2. Las variables declaradas por let en cada ciclo son instancias de variables diferentes

2.1 fue

Mire las siguientes dos piezas de código:

        for(var i = 0; i < 5; i++){
            console.log('---');
            setTimeout(() => console.log(i),0);
        }

Todos adivinen el resultado de este código, creen que es 0 1 2 3 4, pero en realidad es 5 5 5 5 5.

¿Por qué es esto? Primero comprenda setTimeout.

Este es en realidad el bucle de eventos JS mencionado anteriormente, consulte mi artículo para obtener más detalles: JavaScript-Event Loop

Piense setTimeout es una tarea de macro, esperará hasta que se ejecuten todas las tareas síncronas antes de ejecutar. Permítanos darle un ejemplo:

        for(var i = 0; i < 5; i++){
            console.log('---');
            setTimeout(() => console.log(i),0);
        }
        for(var j = 0; j < 5; j++){
            console.log('000000');
        }

La salida de estos dos bucles for es la siguiente: es decir, la tarea asíncrona se ejecuta después de ejecutar todos los códigos síncronos. 

setTimeout (función, 0) tiene muchos usos maravillosos, y les traeré estos pequeños trucos más adelante.

Hablando de eso, el proceso de ejecución del bucle for de la var superior es el siguiente:

La explicación en el libro de ruby: " Al salir del bucle, la variable de iteración guarda el valor que hace que el bucle salga: 5. Cuando se ejecuta la lógica del supermercado más tarde, todas las i son la misma variable, por lo que la salida es la mismo valor final "

El código de setTimeout se ejecuta en último lugar. Sin embargo, cuando se ejecuta el código síncrono, el primer ciclo da i a 0 para el primer setTimeout, y el segundo ciclo da i un valor de 1, porque todos usan el mismo 1. Entonces, después del segundo loop se cambia a 1, el valor i de la tarea asincrónica proporcionado por el primer bucle también cambiará a 1 (debido a que la tarea asincrónica aún no ha comenzado a ejecutarse en este momento, la modificación es válida).

2.2 dejar

Reemplace el código anterior con let:

        for(let j = 0; j < 5; j++){
            console.log('---');
            setTimeout(() => console.log(j),0);
        }

Esta vez la salida es 0 1 2 3 4:

¿por qué?

Las palabras originales en el libro de Ruby son: " Cuando se usa let para declarar variables de iteración, el motor de JavaScript declara una nueva variable de iteración para cada ciclo de iteración en segundo plano, y cada setTimeout se refiere a una instancia de variable diferente ".

De hecho, es la imagen de arriba.Cada vez que se le da el valor de i a setTimeout, no se actualizará antes, porque el valor de i dado cada vez es una nueva instancia de variable .

Nota: Este comportamiento de declarar una variable separada por bucle se aplica a todos los bucles for , incluidos for-in y for-of.

----------------------------------------------------------------------------------------

Acabo de empezar a escribir notas de lectura hoy, y seguiré escribiendo en el futuro, y registraré algunos puntos de conocimiento que no uso con frecuencia. Este libro es realmente bueno. Se puede decir que noté muchos detalles a los que no presté atención. Por ejemplo, aunque sabía que var no tiene alcance a nivel de bloque, sigo usando var para declarar variables de bucle cuando uso for bucles. Lo recordaré más tarde. , Asegúrese de usar let, para que el código sea más riguroso.

 

Supongo que te gusta

Origin blog.csdn.net/huiaixing/article/details/125034871
Recomendado
Clasificación