No se puede acceder a 'xxx' antes de la inicialización y la diferencia entre var, let y const

el código

let newStory = '今天气温 34 摄氏度,:inserta:出去遛弯。当走到:insertb:门前时,突然就:insertc:。人们都惊呆了,李雷全程目睹但并没有慌,因为:inserta:是一个 130 公斤的胖子,天气又辣么热。'
if (document.getElementById("american").checked) {
   let strWeight = newStory.match(/一个 (\S*) 公斤/)[1];
   let newStory = newStory.replace(strWeight + ' 公斤', weight + ' 英镑').replace(strTemperature + ' 摄氏度', temperature + ' 华氏度');
}

razón equivocada

En el alcance del bloque, la variable declarada por let se promueve, pero la variable solo se crea y promueve, y la inicialización no se promueve. El uso de la variable antes de la inicialización formará una zona muerta temporal.

La diferencia entre var, let y const

elevación variable

En términos sencillos, la promoción de variables se refiere al comportamiento en el que el motor de JavaScript eleva la parte de declaración de la variable y la parte de declaración de la función al comienzo del código durante la ejecución del código JavaScript. Después de promocionar la variable, el valor predeterminado de undefined se establece en la variable.

  • era 

        No importa dónde se escriba la declaración de variable, eventualmente se referirá a la parte superior del alcance.

console.log(num) //undefined
var num = 1 
//相当于如下代码
var num
console.log(num)
num = 1

Se promueve la declaración de la función. La primera promoción es var fn. En este momento, fn es una variable y no se le ha asignado una función, por lo que el método fn no se puede ejecutar.

//相当于在此处声明var fn
fn()
var fn = function () {
	console.log(1)  
}
// 输出结果:Uncaught TypeError: fn is not a function

foo()
function foo () {
	console.log(2)
}
// 输出结果:2
  • dejar, const

        Hay una zona muerta temporal para let y const (zona muerta temporal: las variables se crean pero no se inicializan, y las variables no se pueden usar, "No se puede acceder al 'valor' antes de la inicialización"), que solo se mejora en la fase de creación de variables, no en la fase de inicialización Ascensión, formando una zona muerta temporal.

Ventajas de la elevación variable

  • La promoción de declaraciones durante el análisis y la precompilación puede mejorar el rendimiento, lo que permite que las funciones asignen previamente espacio de pila para las variables durante la ejecución;
  • La promoción de declaraciones también puede mejorar la tolerancia a fallas del código JS, de modo que algunos códigos no estándar también se pueden ejecutar normalmente.

alcance

var no tiene el concepto de alcance a nivel de bloque. Si desea encontrar un método para proteger las variables internas, puede usar los cierres para resolverlo; let y const tienen el concepto de alcance a nivel de bloque.

alcance del bloque

El ámbito de nivel de bloque es una pieza de código envuelta en un par de llaves, como funciones, declaraciones de juicio, declaraciones de bucle e incluso un solo {} puede considerarse como un ámbito de nivel de bloque (tenga en cuenta que {} en la declaración de objeto no bloquear el alcance). En pocas palabras, si un lenguaje admite el alcance a nivel de bloque, no se puede acceder a las variables definidas dentro del bloque de código fuera del bloque de código, y después de ejecutar el código en el bloque de código, se destruirán las variables definidas en el bloque de código.

repetir declaración

var puede declarar la misma variable repetidamente, let y const no pueden, y las variables declaradas por const no pueden modificar directamente el valor.

constante

const declara una constante de solo lectura. Una vez declarado, el valor de una constante no se puede cambiar. Una vez que se declara una variable const, debe inicializarse inmediatamente y no puede dejarse para una asignación posterior.

Nota : No es el valor de la variable lo que no se puede cambiar, pero los datos almacenados en la dirección de memoria a la que apunta la variable no se deben cambiar.
Para tipos simples de datos (números, cadenas, valores booleanos), el valor se almacena en la dirección de memoria a la que apunta la variable, por lo que es equivalente a una constante.
Pero para los tipos de datos compuestos (principalmente objetos y matrices), la dirección de memoria a la que apunta la variable es solo un puntero a los datos reales, y const solo puede garantizar que el puntero sea fijo (es decir, siempre apunta a otro fijo). dirección), en cuanto a si la estructura de datos a la que apunta es mutable, está completamente fuera de control. Por lo tanto, se debe tener mucho cuidado al declarar un objeto como una constante.

const a = ['123'];
a = ['456'];
console.log(a);

=> Error "Asignación a variable constante".

Supongo que te gusta

Origin blog.csdn.net/qq_42101569/article/details/126432775
Recomendado
Clasificación