Ogni funzione Javascript deve restituire un valore?


99

Sto usando Netbeans per aggiungere commenti di tipo professionale a ciascuna funzione, scrivo. Quindi inizio ciascuno di essi /**e poi premo Enterper consentire a Netbeans di soddisfare lo schema di commento predefinito per la funzione successiva.

Fino ad ora l'ho usato solo per il linguaggio PHP e in questo caso Netbeans aggiungeva sempre @returns {type}parte solo nello schema dei commenti, se la funzione PHP includeva davvero returnun'istruzione. Nelle cosiddette "procedure" (funzioni che non restituiscono alcun valore) questa parte mancava.

Oggi ho provato la stessa cosa per la funzione Javascript e Netbeans ha aggiunto una @returns {undefined}parte allo schema dei commenti anche se la seguente funzione non restituisce nulla.

Questo mi ha confuso. Netbeans suggerisce in questo modo che ogni funzione Javascript deve restituire qualcosa? Cosa dovrei fare? Ignorare (o eliminare) quella parte dello schema di commento o seguire il suggerimento (se questo è un suggerimento) e aggiungere return false;alla fine di tale funzione, sebbene sia inutile per me?


6
Se non viene specificato alcun valore di ritorno, JavaScript restituirà undefined. In molte lingue viene restituito il risultato dell'ultima istruzione (più utile, IMO). Questi sono chiamati ritorni impliciti .
Zaz

Risposte:


189

La risposta breve è no.

La vera risposta è sì: il motore JS deve essere avvisato che qualche funzione ha terminato la sua attività, cosa che viene eseguita dalla funzione che restituisce qualcosa. Questo è anche il motivo per cui, invece di "finita" , si dice che una funzione "è tornata" .
Una funzione che manca di un'istruzione return esplicita tornerà undefined, come una funzione C (++) che non ha valore di ritorno (e la sua firma riflette questo) per restituire void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Inoltre, in JS, come nella maggior parte delle lingue, sei libero di ignorare semplicemente il valore di ritorno di una funzione, che è fatto moltissimo:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

A un livello molto basso, il ritorno si traduce in una sorta di salto. Se una funzione non restituisse davvero nulla , non ci sarebbe modo di sapere cosa e quando chiamare la funzione successiva, o di chiamare gestori di eventi e simili.

Quindi, per ricapitolare: No, una funzione JS non deve restituire nulla per quanto riguarda il codice. Ma per quanto riguarda i motori JS: una funzione restituisce sempre qualcosa, sia esplicitamente tramite returnun'istruzione, sia implicitamente. Se una funzione restituisce implicitamente, il suo valore di ritorno sarà sempre indefinito.


5
Non credo che C ++ (o C) "restituisca un vuoto". Il tag "void" indica che non restituisce nulla. È un punto minore e non ha nulla a che fare con la domanda posta.
Jay

2
In realtà non restituisce void, non restituisce nulla, ma la sua firma lo riflette attraverso il voidtipo di ritorno.
Elias Van Ootegem

ci sono vantaggi in termini di prestazioni per un ritorno esplicito rispetto a quello implicito?
min

@ 4m1r: non lo so, probabilmente dipende dal motore. Se c'è una differenza di prestazioni, è molto probabile che sia trascurabile. ritorno implicito vs return;è probabilmente utile solo se devi tornare presto. la scrittura return undefined;potrebbe produrre risultati diversi se si undefinedrisolve in un valore diverso. La maggior parte (se non tutti) i browser genererà un errore quando tenti di riassegnare undefined, ma in teoria, è possibile ecco un esempio usando node.js
Elias Van Ootegem

1
@SebastianLasse: mi riferivo a voidin altre lingue (come C), dove puoi avere funzioni come void do_someting(int *arg), ma non puoi avere una variabile con il tipo void. In C, voidnon è realmente un tipo, quindi queste funzioni non restituiscono nulla, saltano e basta
Elias Van Ootegem

26

No, il reso non è necessario.

Ma nessun ritorno in realtà restituisce il fileundefined


6

Ogni funzione Javascript deve restituire un valore?

No, non lo fanno. È vero che nel profondo delle specifiche, questi sono tutti leggermente diversi:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... ma il risultato di chiamare ognuno di loro è lo stesso: undefined. Quindi in termini pragmatici:

  1. Non devi scrivere a return, puoi semplicemente lasciare che l'esecuzione del codice "cada alla fine" della funzione
  2. Se stai tornando undefined, nello specifico, scrivireturn;
  3. Quando si chiama una funzione, non è possibile dire (nel codice) se l'esecuzione è caduta alla fine, terminata con return;o terminata con return undefined;; sembrano tutti esattamente uguali al tuo codice chiamante

Riguardo alle specifiche: in particolare, quando l'esecuzione di una funzione cade alla fine, nella specifica si tratta di un completamento "normale"; ma return;e return value;sono entrambi completamenti "restituiti" con un valore associato ( undefined), che è (anche se leggermente) diverso. Ma la differenza viene eliminata dalla semantica di chiamare una funzione , che dice:

...

  1. Se il risultato . [[Tipo]] è return, restituisce NormalCompletion ( risultato . [[Valore]]).
  2. ReturnIfAbrupt ( risultato ).
  3. Restituisce NormalCompletion ( undefined ).

Quindi non c'è differenza che puoi osservare nel codice.


2

No, non devi restituire qualcosa per ogni funzione. È facoltativo e dipende dal modo in cui scrivi la logica del codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.