Sé que hay varias formas de definir una función en JavaScript. Dos de los más comunes son:¿Qué sucede en JavaScript cuando uso la declaración de la función C "tradicional"?
(1) function add (a, b) {
return a + b;
}
(2) var add = function (a, b) {
return a + b;
}
Me siento cómodo con la idea de una función como un objeto que se puede pasar en torno al igual que cualquier otra variable. Así que entiendo perfectamente lo que está haciendo (2)
. Está creando una función y asignando a add
(digamos que esto está en el alcance global, entonces add
es una variable global) dicha función. Pero entonces, ¿qué sucede si uso (1)
? Ya sé que hace una diferencia en el orden de ejecución: si uso (1)
, puedo referirme a add()
antes del punto en el código donde está definido add()
, pero si uso (2)
entonces tengo que asignar mi función a add
antes de poder comience refiriéndose al add()
.
¿Es (1)
un atajo para (2)
, aunque uno que se comporta como otros lenguajes de estilo C nos permite definir una función "debajo" del punto en el que se utiliza? ¿O es internamente un tipo diferente de función? ¿Cuál es más "en el espíritu" de JavaScript (si ese no es un término demasiado vago)? ¿Te limitarías a uno u otro, y si es así cuál?
Una declaración de función dentro del bloque de una instrucción 'if' es un error de sintaxis, de acuerdo con la especificación ECMAScript. Ninguno de los principales navegadores arroja un error, probablemente debido al precedente establecido por IE y Mozilla. Mozilla lo soluciona incluyendo una extensión a ECMAScript llamada 'FunctionStatement' (http://www.jibbering.com/faq/#functionStatement, http://kangax.github.com/nfe/#function-statements). JScript tiene menos respeto por la especificación y sabe Dios qué internamente. –
Un comentario sobre su edición: es cierto que las declaraciones de funciones también se conocen como declaraciones de funciones, pero incorrectamente. Las preguntas frecuentes de comp.lang.javascript (vinculadas a en mi comentario anterior) hacen que este punto sea muy elocuente: * "El enunciado de función de término ha sido usado de manera amplia e incorrecta para describir una 'FunctionDeclaration'. Esto es engañoso porque en ECMAScript,' FunctionDeclaration 'no es un' Statement'; hay lugares en un programa donde se permite un 'Statement' pero no un' FunctionDeclaration'. "* –
@Tim: Gracias por los comentarios interesantes. No estaba al tanto del problema de nombres de "declaración". –