Cuando aprendía JavaScript, encontré un problema con el izado, es decir, si ejecuta el código a continuación, ¿qué obtendrá?
f1(); console.log(b); console.log(a); function f1() { var a = b = 1; console.log(a); console.log(b); }La respuesta es que obtiene tres 1 y un error que tiene sentido debido a la elevación. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
Con base en el resultado, puedo inferir que var a = b = 1; es igual a var a = 1; b = 1;
Mi problema es ¿Por qué?
Intenté buscarlo en Google, pero parece que no hay una explicación sobre el orden en que se ejecutan var y '='. Te agradecería que me mostraras como la var a = b = 1; se ejecuta paso a paso.
Porque la asignación es una expresión que se evalúa al valor asignado. Entonces esta operación:
b = 1 no solo asigna el valor de 1 a b sino que también la expresión completa se evalúa como el valor de 1 . Dado que es una expresión que se evalúa como un valor, se puede usar en cualquier momento que se necesite un valor.
Esto necesita un valor:
var a = (something)Entonces puedes usar cualquier expresión, por ejemplo:
var a = (b = 1) Y los paréntesis son innecesarios ya que la asignación a no ocurrirá hasta que se evalúe la expresión y se produzca un valor:
var a = b = 1Lo que no funcionaría es declarar y asignar como una expresión. Por ejemplo:
var a = (var b = 1)Porque la declaración no es una expresión, es una declaración . Las declaraciones se pueden considerar como "una línea de código" y no se pueden colocar en el medio de otro código.
Puede probar esto en las herramientas de depuración de su navegador ingresando el código directamente en la consola. Si haces esto:
var a = 1 La consola imprimirá undefined , porque la declaración no produjo ningún valor (aunque asignó un valor a a ). Si haces esto:
b = 1 La consola imprimirá 1 porque la expresión produjo un valor (además de asignar un valor a b ).
Con respecto al resto del código que se prueba en la pregunta, la diferencia clave entre a y b es que a se declara y, por lo tanto, tiene un alcance específico , mientras que b no se declara y, por lo tanto, tiene una propiedad predeterminada en el objeto de window al que se puede acceder desde cualquier lugar. .