Me interesa saber si hay algún límite con respecto a qué tipos de valores se pueden establecer usando const
JavaScript, en particular funciones. ¿Es esto válido? De acuerdo, funciona, pero ¿se considera una mala práctica por alguna razón?
const doSomething = () => {
...
}
¿Deberían definirse todas las funciones de esta manera en ES6? No parece que esto se haya dado cuenta, si es así.
Gracias por cualquier comentario!
javascript
function
const
ecmascript-6
David Sinclair
fuente
fuente
var doSomething = <function def>;
. 4) "¿Deberían definirse todas las funciones de esta manera en ES6?" Me parece engorroso. Me gustan las declaraciones de funciones. Cada uno lo suyo.const
. ¿Desea evitar anular la función? Supongo que sabes tu código para no hacer esto de todos modos. ¿Desea expresar la intención dedoSomething
, es decir, que tiene una función y no cambia su valor? Creo que las declaraciones de funciones comunican esta intención claramente también. Por lo tanto, si necesita "protección en tiempo de ejecución" contra anulación, hágalo. De lo contrario, no veo mucho beneficio. Por supuesto, si solías usarlo principalmentevar foo = function() {};
, lo usaría enconst
lugar devar
.const
absoluto.Respuestas:
No hay problema con lo que has hecho, pero debes recordar la diferencia entre las declaraciones de funciones y las expresiones de funciones.
Una declaración de función, es decir:
Se eleva completamente a la parte superior del alcance (y les gusta
let
yconst
también tienen un alcance de bloque).Esto significa que lo siguiente funcionará:
Una expresión de función, es decir:
Es la creación de una función anónima (
function () {}
) y la creación de una variable, y luego la asignación de esa función anónima a esa variable.Por lo tanto, las reglas habituales sobre el levantamiento de variables dentro de un alcance: las variables de ámbito de bloque (
let
yconst
) no se alzanundefined
en la parte superior de su alcance de bloque.Esto significa:
Fallará ya
doSomething
que no está definido. (Lanzará unReferenceError
)Si cambia a usar
var
, obtiene el levantamiento de la variable, pero se inicializará paraundefined
que el bloque de código anterior todavía no funcione. (Esto arrojará unTypeError
dadodoSomething
que no es una función en el momento en que lo llama)En lo que respecta a las prácticas estándar, siempre debe usar la herramienta adecuada para el trabajo.
Axel Rauschmayer tiene una excelente publicación sobre alcance y elevación, incluida la semántica es6: Variables y alcance en ES6
fuente
function a(){console.log(this);}
y bconst a=_=>{console.log(this);}
es si lo llamas comoa.call(someVar);
, en a , se imprimirásomeVar
, en b , se imprimiráwindow
.Aunque usar
const
para definir funciones parece un truco, viene con algunas grandes ventajas que lo hacen superior (en mi opinión)Hace que la función sea inmutable, por lo que no tiene que preocuparse de que alguna otra pieza de código cambie esa función.
Puede usar la sintaxis de flecha gruesa, que es más corta y limpia.
El uso de las funciones de flecha se encarga del
this
enlace por usted.ejemplo con
function
mismo ejemplo con
const
fuente
function f(x, y) {
tiene 18 caracteres,const f = (x, y) => {
tiene 21 caracteres, entonces 3 caracteres más. 3. Mantener este enlace solo importa si las funciones se definen dentro de un método (u otra función que tenga sentido). En el script de nivel superior no tiene sentido. No digo que estés equivocado, solo que las razones que mencionas no son terriblemente relevantes.Han pasado tres años desde que se hizo esta pregunta, pero ahora me la estoy cruzando. Dado que esta respuesta está muy por debajo de la pila, permítame repetirla:
Estaba motivado para investigar un poco después de observar a un prolífico codificador de JavaScript que siempre usa una
const
declaraciónfunctions
, incluso cuando no hay una razón / beneficio aparente.En respuesta a " ¿se considera una mala práctica por alguna razón? ", Permítanme decir, en mi opinión, sí, o al menos, hay ventajas al usar la
function
declaración.Me parece que esto es en gran medida una cuestión de preferencia y estilo. Hay algunos buenos argumentos presentados anteriormente, pero ninguno tan claro como se hace en este artículo:
Confusión constante: por qué sigo usando declaraciones de función de JavaScript de medium.freecodecamp.org/Bill Sourour, JavaScript guru, consultor y profesor.
Insto a todos a leer ese artículo, incluso si ya ha tomado una decisión.
Aquí están los puntos principales:
fuente
defaultErrorHandler
const asignado como una función anónima que luego puedo llamar desde los encargados de la promesa. Esto me permitiría opcionalmente 'anular' este controlador de errores predeterminado dentro de las funciones que necesitaba. Algunos solo necesitan devolver un objeto de error y otros necesitan devolver una respuesta http, variando los niveles de verbosidad. Sin embargo, la estructura del código puede ser un patrón familiar independientemente..then( res.success, res.error )
mucho más que las funciones anónimas que estaba declarando simplemente llamarres.success(value);
. Tener un.then( ..., defaultErrorHandler)
patrón común podría ser agradable, con una función defaultErrorHandler definida de nivel superior y, opcionalmente, tener una funciónconst defaultErrorHandler = error => { ... }
declarada dentro del alcance de una función como se desee.El uso de
const
algunos beneficios es muy importante y algunos dirían que debe usarse siempre que sea posible debido a lo deliberado e indicativo que es.Es, por lo que puedo decir, la declaración de variables más indicativa y predecible en JavaScript, y una de las más útiles, PORQUE está limitada. ¿Por qué? Porque elimina algunas posibilidades disponibles
var
ylet
declaraciones.¿Qué puedes inferir cuando lees un
const
? Usted sabe todo lo siguiente simplemente leyendo laconst
declaración de declaración, Y sin buscar otras referencias a esa variable:La siguiente cita es de un artículo que argumenta los beneficios de
let
yconst
. También responde más directamente a su pregunta sobre las restricciones / límites de la palabra clave:Fuente: https://ponyfoo.com/articles/var-let-const
fuente