¿Cuál es la ventaja de asignar una función a una var?

10

Dado este ejemplo de Javascript que encontré

var sum = function() {
  var i, sum = 0;
  for(i = 0; i < arguments.length; i += 1) {
    sum += arguments[i];
  }
  return sum;
};

¿Qué ventaja hay en asignar una función a una var?

octopusgrabbus
fuente
stackoverflow.com/questions/336859
BlueRaja - Danny Pflughoeft

Respuestas:

8

La respuesta corta que creo es simplemente que está creando una función anónima asignada a una variable, en lugar de crear una función con nombre con ...

    function sum() {}

Una buena manera de verificar las diferencias es llamar a .ToString () en ellas y ver la diferencia o puede hacer console.log (sum.name). Uno dará un nombre real y el otro nada, es decir, la función anónima (la asignada a la var). También hay detalles, como var sum = function () {} se define en tiempo de ejecución y la función sum () {} se define en tiempo de análisis.

clave armónica
fuente
Lo que quiero decir con la última oración es que si intentaste llamar a sum () en una línea anterior arriba donde fue definida por var, entonces habría un error. Si se define como en mi respuesta, entonces no habría ningún error, incluso si la llamada estaba por encima de la función.
harmonickey
12
Eso explica la diferencia , pero no creo que explique la ventaja .
Keith Thompson
¿Cuál es la diferencia entre el tiempo de análisis y el tiempo de ejecución?
Wern Ancheta
1
No tiene nada que ver con funciones con nombre, aún puede asignar una función con nombre a una variable
Juan Mendes
5

Una ventaja es que no puede usar una declaración de función en un bloque. Solo pueden estar en el nivel superior de un archivo o directamente dentro de otra función.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Todo esto no está especificado por el estándar y los navegadores hacen cosas diferentes, consulte /programming/10069204/function-declarations-inside-if-else-statements . Entonces, si tiene que usar el otro estilo a veces, por coherencia, es posible que siempre desee hacerlo

Además, no estoy seguro de esto, pero si recuerdo correctamente, algunos minificadores antiguos no eran lo suficientemente inteligentes como para manejar declaraciones de funciones y no cambiarles el nombre.

Austin
fuente
3

No soy un experto en Javascript, así que tómalo con un poco de sal. Creo que en algunos casos la gente podría hacerlo por estilo y lo mismo podría lograrse simplemente escribiendo "function sum () {...}"

Sin embargo, asignar una función a una variable es una técnica muy poderosa en la programación funcional. Si está familiarizado con OOP, es algo similar al polimorfismo. Piense en el ejemplo clásico de la clase base de animales y las clases de deriva de perros / gatos. Puede escribir código que funcione con Animal pero cuando llama a una función, esa función podría hacer un trabajo diferente dependiendo del tipo de instancia.

En la programación funcional, podría tener un algoritmo que funciona con "una función", pero si está utilizando una variable para llamar a esa función, tiene la flexibilidad de asignar una función diferente en tiempo de ejecución.

Por ejemplo, supongamos que escribe un algoritmo para presentar 10,000 puntos de datos en una ventana que tiene solo 500 píxeles de ancho. Cada píxel representará 20 puntos de datos y, para presentarlos, debe agregar esos 20 puntos de datos en un solo valor.

Entonces, supongamos que define un algoritmo para presentar los 10,000 puntos y este algoritmo usa una variable de función llamada agregado de la siguiente manera:

...
displayValue = aggregate( numbersInOnePixel );
...

Ahora, en tiempo de ejecución, su usuario puede seleccionar cómo se agregarán los datos. Su variable de función real puede ser cualquiera de los siguientes:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
DXM
fuente
0

Es principalmente una cuestión de estilo, ya que las únicas situaciones en las que aparece la diferencia (llamar a algunas de las funciones antes de finalizar todas las declaraciones; usar el método toString) son una especie de casos de esquina, en mi opinión.

Uno de los argumentos que he escuchado que respalda este var =estilo es que es consistente con la forma en que declaras variables normales. Esto limita la cantidad de funciones de lenguaje que usa y simplifica la tarea de presentar su programa a alguien nuevo en Javascript.

hugomg
fuente