javascript - que - ¿Cuál es el significado de los refuerzos “{” “}” alrededor de este código de biblioteca de reacción?




que se puede hacer con javascript en html (2)

Estaba revisando el código de la biblioteca. Después de leerlo, encontré un código especial que no puedo entender su significado. ¿Alguien puede ayudar?

var validateFormat = function () {};

{
  validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

Aquí, ¿por qué reaccionar el desarrollador ha envuelto el validateFormat en llaves? ¿Hay algún significado de hacer esto?

Si hago lo siguiente, funciona igual.

var validateFormat = function () {};

validateFormat = function (format) {
   if (format === undefined) {
   throw new Error('invariant requires an error message argument');
   }
};

El alcance del bloque es el resultado de su babel-preset-fbjs . Si observa la fuente original , encontrará que, en cambio, esta función se define condicionalmente según el valor de __DEV__ , que se optimiza durante la transpilación ya que es equivalente a process.env.NODE_ENV !== 'production' .

let validateFormat = () => {};

if (__DEV__) {
  validateFormat = function(format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

Este código tiene mucho sentido.

var v = function () {};

{
  v = function (format) {
    // actual code
  };
}

La primera asignación define v a una función de marcador de posición vacía para que el código no se rompa.

La segunda asignación contiene el código real de la función. Está dentro de un ámbito de bloque , que es una construcción JS legítima.

Pero ... el alcance del bloque no hace nada debido al levantamiento de variables, lo que anula cualquier localidad contraria a las expectativas de los adeptos de C / C ++. Muchos dicen que no hay un ámbito de bloqueo en JS, lo cual es falso. Hay un ámbito de bloque pero no es efectivo (aparte de las declaraciones let / const más recientes).

Entonces, lo que hace este código es abusar de la sintaxis de bloque ineficaz para separar visualmente partes del código.

Pero (y esto es lo que creo que está pasando aquí) lo que vemos aquí es solo un EJEMPLO . Podría muy bien dar otro ejemplo que tenga perfecto sentido, como este:

var v = function () {};

{
  let localValue = 0;

  v = function (format) {
    // actual code using localValue
    localValue = 1;
  };
}

En otras palabras, puede encontrar otros ejemplos en la base del código que aprovecha el alcance del bloque a través de let / const y encapsula la definición como se muestra. El ejemplo que da simplemente no aprovecha esta oportunidad, pero el alcance sigue siendo porque:

  • no interrumpe ni rompe el código;
  • uniformidad;
  • en el futuro puede llevar más peso agregando let / const .

Todo esto es adivinar por mi parte.







ecmascript-6