Hay diferencias, pero el rendimiento no es la más importante.
En realidad hay 3 cosas distintas (no sólo dos como tú comentas) y cada una tiene sus matices y detalles. Hay una explicación muy buena en
dev.mozilla, pero si quieres te señalo algunos detalles.
- Hay 3 formas de definir/declarar/crear una función:
- Constructor
- Declaración
- Expresión
Cada una de ellas hace algo ligeramente distinto y tiene sus usos. - El constructor Function (con mayúscula y usando el operador new, var x = new Function("msg","alert(msg);");), crea una función a partir de una cadena. Sí es cierto que cada vez que se llama debe recompilar la cadena a una función. Precisamente ese es su uso. Imagina que construyes la función dinámicamente y el contenido de la cadena puede variar. Piensa en ello como una mezcla de eval() y la creación de una función.
- La expresión de función, var x = function(msg) { alert(msg); };, asigna una función a una variable. Puede ser una función anónima, como en este caso, o no (var x = function nombre(msg) { alert(msg); };) y en este segundo caso hay que saber que "nombre" sólo está visible dentro de la función.
- La declaración de una función, function x(msg) { alert(msg); };, es parecida a la expresión pero además define "automágicamente" una variable del mismo nombre que la función. Es decir, que es básicamente equivalente a var x = function x(msg) { alert(msg); };
- El detalle concreto de asignar una función a una variable, es en realidad el detalle menor. Como decía antes, al hacer function A() { ... } se crea automágicamente una variable A. Las diferencias pueden venir marcadas por el alcance (scope), según dónde declares o asignes la función (dentro de otra, en el alcance global, en un objeto literal, en un bucle...).
En general,
salvo el uso del constructor Function que podemos considerar un caso aparte, la diferencia entre la declaración y la asignación de expresión, es poca, y en cuanto a rendimiento nula. Usar declaración o usar asignación de expresión es, en la mayoría de casos, una cuestión de estilo. O en todo caso, de sutiles detalles de gestión del alcance, pero como digo el rendimiento no es razón.