Cada vez veo más funciones declaradas como
var foo = function() {
// things
};
En lugar de cómo había aprendido, como
function foo() {
// things
}
¿Cual es la diferencia? ¿Mejor presentación? ¿Alcance? ¿Debo estar usando este método?
javascript
functions
Steve Robbins
fuente
fuente
Respuestas:
var foo = function() {}
define una variable que hace referencia a una función anónima.function foo() {}
define una función con nombrefoo
.Se puede pasar por nombre como parámetros de función y se puede instanciar si el uso previsto es para OOP.
Al final del día, cuál usa usted está en gran medida dictado por su caso de uso específico (Javascript es divertido así;)). Si al final el uso de la antigua, me fuertemente sugieren que nombre la función:
var foo = function MY_function() {}
. Esta convención de nomenclatura ayuda a que su pila de llamadas del depurador no sea inútil.fuente
foo
funciónMY_function
expresión de función:
La expresión func en este caso es anónima pero se asigna a una var como referencia. Esto es diferente de una declaración de función etiquetada de las siguientes maneras:
new someFunction().constructor.name === 'someFunction';//false
las instancias no obtienen el nombre var para constructor.name porque se asigna una referencia a la función a la var pero la var, no la función, está vinculada al nombre varEn una declaración de función etiquetada:
new someFunction().constructor.name === 'someFunction'; //true
el nombre está vinculado directamente a la función.En términos generales, no hay una buena razón para hacer una expresión en var a menos que desee que las llamadas fallen si las cosas se mueven o si está definiendo / asignando un método en una línea. De hecho, encuentro que el izado es útil para organizar objetos con funciones internas y definiciones de métodos en la parte inferior para poder llegar al comportamiento real del objeto y hacer definiciones de métodos públicos de una línea (simplemente asignando funciones
this.
con el mismo nombre) todo en uno lugar para facilitar la referencia. Siempre debe intentar usar declaraciones etiquetadas para constructores, IMO, para que pueda identificar el 'tipo' de un objeto a través de su constructor.fuente
Su primer ejemplo es una expresión, mientras que el segundo ejemplo es una declaración . La definición de funciones como expresiones permite una mayor flexibilidad en el lugar donde puede aparecer la definición, a qué puede asignarla, que puede pasarla como parámetro, etc.
Por ejemplo:
vs ...
Los ejemplos más complejos se volverían oblicuamente complicados sin la sintaxis de expresión de función.
Mira /programming/111102/how-do-javascript-closures-work
fuente
La principal diferencia práctica es la elevación. Por ejemplo:
vs
Además, este es un comportamiento indefinido
mientras esto está bien.
fuente
if
declaración!