11

Scrivo codice JavaScript e cerco di utilizzare la sua natura linguaggio funzionale.Devo sempre dare un valore di ritorno alla mia funzione?

In altri linguaggi funzionali (o anche in Ruby), se non imposto esplicitamente il valore di ritorno di una funzione, restituirà il valore dell'ultima espressione valutata. JavaScript non segue questo schema. (Per essere precisi, JavaScript restituisce sempre anche un valore. Se non è stato impostato nulla, quindi undefined.)

La mia domanda è la seguente: Ho una funzione che non ha bisogno di (e non) restituire un valore . Ha senso in un contesto di programmazione funzionale avere una funzione senza un valore di ritorno esplicito? Oppure ha fallito da qualche parte se mi sono trovato in questo caso?

Ad esempio, ho la seguente funzione. Controlla periodicamente se l'hash della posizione è stato modificato e, in tal caso, chiama la funzione data.

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    window.setInterval(pollHash, 100); 
}; 

Devo tornare qui?

Aggiornamento

Nel frattempo mi è venuto in mente, che se in qualsiasi momento in futuro avrò bisogno di estendere la conoscenza di LIB_hashManager, seguendo il modello di costruzione funzionale, posso semplicemente aggiungere metodi a un oggetto e LIB_hashManager restituirà quell'oggetto prodotto.

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 
}; 

E più tardi io possa scrivere:

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 

    // return public methods 
    return { 
     // ... 
    } 
}; 

Quindi non ha senso quindi per restituire un oggetto vuoto nel primo caso?

risposta

18

Un ambiente di programmazione funzionale "puro" non avrebbe effetti collaterali - il lavoro di ciascuna funzione sarebbe interamente nel calcolo del suo valore di ritorno; ciò non è realmente fattibile negli usi tipici di Javascript, e quindi è perfettamente accettabile, quando una funzione ha fatto il suo lavoro attraverso gli effetti collaterali, per far sì che non restituisca nulla, cioè che sia una "procedura" piuttosto che una funzione.

+15

Come uno dei creatori di Haskell ha detto (parafrasando) "Se la tua intera macchina funziona sulla base di un approccio puramente funzionale, tutto ciò che uscirai sarebbe una scatola calda, non vedresti mai i risultati aveva calcolato ". :) –

2

È perfettamente necessario avere una funzione che non restituisce nulla. Infatti, forzare una funzione che naturalmente non avrebbe un valore di ritorno per averne uno è scomoda e gli odori non validi.

+0

Se non ha un valore di ritorno, allora non è una funzione, anche se è così chiamato nel linguaggio di cui stiamo parlando. – Ingo

5

La mia domanda è la seguente: Ho una funzione che non ha bisogno di (e non) restituire un valore. Ha senso in un contesto di programmazione funzionale avere una funzione senza un valore di ritorno esplicito? Oppure ha fallito da qualche parte se mi sono trovato in questo caso?

Secondo la descrizione accademica di una funzione: una funzione deve fornire lo stesso risultato dato un input. Una funzione che non ha output è assolutamente inutile, perché non si suppone che le funzioni abbiano effetti collaterali.

Tuttavia, poiché i linguaggi di programmazione funzionale spesso richiedono almeno 1 effetto collaterale, la convenzione per restituire nulla è restituire un'unità o "()". Dal momento che questo concetto non esiste in Javascript, non dovrebbe essere importante per te, dal momento che Javascript non è comunque tipizzato fortemente.

0

Se non si prevede di utilizzare il risultato di LIB_hashManager, penso che si dovrebbe restituire definitivamente undefined (vale a dire, non avere alcuna dichiarazione di ritorno).

Se si dimentica questo e tenta di utilizzare il risultato della funzione in ogni caso probabilmente solo ottiene un errore (che va bene dato che sarebbe un errore di programmazione, un bug!)

1

La funzione che produce solo l'effetto collaterale può essere considerato semplicemente come un blocco di programma isolato, come un blocco di procedura. Poiché JS non ha procedure, non c'è niente di sbagliato nell'usare una funzione come blocco di procedura. L'unica eccezione che funziona in JS sono anche gli oggetti, quindi fai attenzione con l'uso esteso di tali "funzioni".

In questo caso aumenta solo la leggibilità del programma.

0

Questa domanda è stato risposto oltre 4 anni fa, ma credo che, la risposta accettata è sbagliato


Nel codice data, autore definisce l'intervallo e poi - non fornisce alcuna modo per fermarlo.

E così la risposta dovrebbe essere: Sì, si dovrebbe restituire un valore da questa funzione, e che il valore dovrebbe essere un oggetto che consente di smettere di intervallo, che viene avviato all'interno di esso.

Discutere dettagli di come dovrebbe essere implementato fuori ambito. // puoi farlo sia restituendo il gestore di intervalli, in modo da poterlo cancellare manualmente (vedi esempio 1) o restituendo un oggetto con metodo che lo fa dietro la scena (smar come .pause, .stop o .cancel). In alternativa, tale oggetto può anche consentire la riconfigurazione run-time del gestore hash (come la modifica della frequenza dell'intervallo).

Esempio 1 (semplice):

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    return window.setInterval(pollHash, 100); 
};