que puede para paginas hacer con codigo biblioteca animaciones javascript reactjs ecmascript-6

puede - que hacer con javascript



¿Cuál es el significado de los refuerzos “{” “}” alrededor de este código de biblioteca de reacción? (3)

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''); } }; }

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''); } };


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.


Las llaves aquí son enunciado de bloque . No sirven para nada en este caso y pueden omitirse de manera segura. El alcance del bloque no funciona con var . Incluso si se let , la instrucción de bloque no lo afectaría porque validateFormat ya está definido fuera de la instrucción de bloque.

Un ejemplo donde la instrucción de bloque es útil sería:

let validateFormat = function () {}; { // doesn''t reassign validateFormat from outer scope let validateFormat = function (format) { if (format === undefined) { throw new Error(''invariant requires an error message argument''); } }; // validateFormat from block scope is used here } // validateFormat from outer scope is used here

La respuesta proporciona una explicación técnicamente correcta. El problema real aquí es que la pregunta contiene un código incorrecto que no tiene sentido porque if (...) se omitió la declaración cuando se pegó el código, como muestra la respuesta aceptada.