C'est vrai - parce que c'est ainsi que JavaScript a été conçu.
Mais je ne pense pas que ce soit la réponse que tu cherchais, alors réfléchissons...
Essayez de vous mettre à la place de Brendan Eich la personne qui a conçu JavaScript.
Sur statique Dans les langages, il existe généralement une distinction entre une fonction qui n'est pas retourner n'importe quoi ( void
), et une fonction qui renvoie une certaine valeur. Brendan a choisi de concevoir une dynamique c'est-à-dire un langage qui ne nécessite pas de définir les types de retour des fonctions. Ainsi, JavaScript ne vérifie pas ce que vous retournez de la fonction pour vous donner une liberté totale.
Vous pouvez avoir une fonction qui renvoie un nombre...
function computeSomething() {
return 2;
}
... ou une chaîne ...
function computeSomething() {
return 'hi';
}
... ou, en fait, n'importe lequel d'entre eux :
function computeSomething() {
if (Math.random() > 0.5) {
return 2;
} else {
return 'hello';
}
}
Parfois, vous n'avez pas besoin de calculer quoi que ce soit, vous avez seulement besoin de faire quelque chose.
Donc vous ne rendez rien.
function doSomething() {
console.log('doing something');
}
Nous pouvons cependant vouloir quitter une fonction au milieu de celle-ci, et puisque return <value>
le fait déjà exactement cela il est logique d'autoriser l'écriture return
sans valeur pour soutenir ce cas d'utilisation :
function doSomething(num) {
if (num === 42) {
return;
}
while (true) {
doSomethingElse();
}
}
Cela est également conforme à la syntaxe C/Java, ce qui était l'un des objectifs pour assurer l'adoption de JavaScript.
Oui, c'est là que le bât blesse : que se passe-t-il si on met un simple return
dans une fonction censée calculer quelque chose ? Notez que on ne peut pas interdire ça L'une de nos premières décisions a été de faire de JavaScript un langage dynamique, dans lequel nous ne vérifions pas ce que la fonction renvoie.
function computeSomething(num) {
if (num === 42) {
return; // just return? o_O
}
if (Math.random() > 0.5) {
return 2;
} else {
return 'hello';
}
}
var x = computeSomething(2); // might be 2, might be 'hello'
var y = computeSomething(42); // ???
Bien sûr, Brendan aurait pu décider de lever une erreur dans ce cas, mais il a sagement décidé de ne pas le faire, car cela conduirait à des erreurs difficiles à trouver et à un code trop facilement cassable.
Donc un vide return
a obtenu un sens "retour undefined
".
Mais quelle est la différence entre une fonction qui revient tôt ou à la fin ? Il ne devrait pas y en avoir, du point de vue du code appelant. Le code appelant n'est pas censé connaître quand exactement la fonction a retourné ; il est seulement intéressé par la valeur de retour (si elle existe).
La seule conclusion logique serait donc de faire undefined
la valeur de retour "par défaut" si la fonction n'en spécifie pas une par le biais d'une commande explicite. return <value>
opérateur. Ainsi, return
et la sémantique de la fonction exécutée jusqu'à la fin correspond.
Python, un autre langage dynamique qui a précédé JavaScript, résout ce problème de la même manière : None
est retourné si la fonction ne spécifie pas de valeur de retour. .