javascript - pasar - Función anónima vs función normal
pasar funcion como parametro javascript (1)
Solo por interés, ¿hay diferencias de velocidad / funcionalidad entre
function foo(bar) {
alert("foo" + bar);
}
y
var foo = function(bar) {
alert("foo" + bar);
};
No hay diferencias significativas de velocidad. ( Test )
Hay diferencias de funcionalidad.
- Las declaraciones de funciones (como la primera) y las expresiones de la función (como la segunda) se procesan en diferentes momentos.
- Tienen diferentes efectos sobre el alcance en el que se producen.
- Su primera función tiene un nombre verdadero ,
su segunda noen ES5 y antes, su segunda no; en ES6 / ES2015, lo hace, porque la especificación dice que el motor de JavaScript debe asignar el nombre de la variable a la función en ese caso.
Si busca "declaración de función" en lugar de "expresión de función", encontrará mucha información (algunas de ellas incluso correcta) sobre el tema.
Pero brevemente:
Declaración de funciones
Una declaración de función como su primer ejemplo ocurre cuando el cursor de ejecución ingresa en su ámbito de contención (que contiene la función o el alcance global), antes de que se realice cualquier código paso a paso. Por lo tanto, no pueden aparecer dentro de bloques no funcionales ( if
, try
, etc.), ya que no se ha ejecutado ningún código paso a paso cuando se procesan. El nombre de la función se agrega al ámbito en el que aparece, y el objeto de la función tiene un nombre verdadero (aunque no hay una forma estándar de consultar ese nombre, sigue siendo útil en los seguimientos de pila y demás). (Nota: algunos motores de JavaScript permiten declaraciones de funciones dentro de bloques, pero no son válidos y lo que hacen no es necesariamente consistente. No lo hagas).
Expresión de función anónima
Una expresión de función como su segundo ejemplo sucede, como todas las expresiones, cuando se encuentra en el flujo paso a paso del código. Su expresión se llama una expresión de función anónima ya que no especifica explícitamente un nombre para la función. En ES5 y versiones anteriores, eso significaba que la función resultante no tenía nombre. En ES6 / ES2015 y posteriores, muchas funciones creadas con expresiones de función anónimas sí tienen nombres porque el nombre se puede inferir de la expresión, y ese es el caso de su ejemplo, en el que la función termina con el nombre que la variable tiene: foo
. Dado que las expresiones de funciones anónimas son expresiones, pueden ocurrir en cualquier lugar donde puedan ocurrir expresiones, aunque a veces hay que advertir al analizador que eso es lo que está haciendo.
Expresión de función nombrada
Hay una tercera forma de hacer esto: una expresión de función con nombre , en lugar de una anónima. Se ven así:
var foo = function bar() {
};
o
var obj = {
foo: function bar() {
}
};
o
doSomething(function bar() { });
etc.
Solían ser un navegador cruzado realmente problemático (por ejemplo, IE8 y versiones anteriores desordenaron ; las primeras versiones de Safari tuvieron problemas, etc.; Kangax tiene una buena página de los problemas que solían abundar). Es una expresión, por lo que es válida en cualquier lugar donde haya una expresión. El nombre de la función ( bar
en mi ejemplo) no se agrega al ámbito de contenido por un motor de JavaScript compatible.