Qual è il vantaggio dell'assegnazione di una funzione a una var?

9

Dato questo esempio di Javascript, ho trovato

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

Che vantaggio c'è nell'assegnare una funzione a una var?

    
posta octopusgrabbus 23.09.2012 - 01:44
fonte

4 risposte

9

La risposta breve credo sia semplicemente che stai creando una funzione anonima assegnata a una variabile, invece di creare una funzione con nome ...

    function sum() {}

Un buon modo per controllare le differenze è chiamare .ToString () su di loro e vedere la differenza o si potrebbe fare console.log (sum.name). Uno darà un nome effettivo e l'altro nulla, cioè la funzione anonima (quella assegnata alla var). Ci sono anche specifiche, come var sum = function () {} viene definito in fase di esecuzione e la funzione sum () {} viene definita in fase di analisi.

    
risposta data 23.09.2012 - 01:52
fonte
4

Un vantaggio è che non è possibile utilizzare una dichiarazione di funzione in un blocco. Possono essere solo al livello più alto di un file o direttamente all'interno di un'altra funzione.

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

Questi sono tutti non specificati dallo standard e i browser fanno cose diverse, vedi link . Quindi, se a volte devi usare l'altro stile, per coerenza puoi volerlo fare sempre

Inoltre, non sono sicuro di questo, ma se ricordo bene alcuni vecchi minifiers non erano abbastanza intelligenti da gestire le dichiarazioni di funzione e non li rinominavano.

    
risposta data 23.09.2012 - 05:01
fonte
3

Non sono un esperto di Javascript, quindi prendi questo con un pizzico di sale. Penso che in alcuni casi le persone potrebbero farlo per stile e la stessa cosa potrebbe essere ottenuta semplicemente scrivendo "function sum () {...}"

Tuttavia, assegnare una funzione a una variabile è una tecnica molto potente nella programmazione funzionale. Se hai familiarità con OOP, è in qualche modo simile al polimorfismo. Pensa al classico esempio di classe base animale e classi derivate dal gatto / cane. Puoi scrivere il codice che funziona con Animal ma quando chiama una funzione, quella funzione potrebbe fare lavori diversi a seconda del tipo di un'istanza.

Nella programmazione funzionale, potresti avere un algoritmo che funziona con "una funzione" ma se stai usando una variabile per chiamare quella funzione, hai la flessibilità di assegnare una funzione diversa in fase di esecuzione.

Ad esempio, supponiamo che tu scriva un algoritmo per presentare 10.000 punti dati in una finestra che ha solo 500 pixel. Ogni pixel rappresenterà quindi 20 punti dati e per presentarli è necessario aggregare questi 20 punti dati in un singolo valore.

Quindi supponiamo di definire un algoritmo per presentare i 10.000 punti e questo algoritmo utilizza una variabile di funzione chiamata aggregato in questo modo:

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

Ora in fase di esecuzione l'utente può selezionare la modalità di aggregazione dei dati. La tua variabile di funzione effettiva può essere una delle seguenti:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
    
risposta data 23.09.2012 - 05:57
fonte
0

È principalmente una questione di stile, dal momento che le uniche situazioni in cui si manifesta la differenza (chiamare alcune delle funzioni prima di terminare tutte le dichiarazioni, usando il metodo toString) sono tipi di casi d'angolo, nella mia opinione.

Uno degli argomenti che ho sentito sostenere questo stile var = è che è coerente con il modo in cui dichiari le variabili normali. Questo limita il numero di funzioni linguistiche che usi e semplifica l'induzione del tuo programma a qualcuno di nuovo in Javascript.

    
risposta data 23.09.2012 - 03:02
fonte

Leggi altre domande sui tag