Je suis un peu choqué que personne ici n'ait directement référencé la spécification :
12.9 L'instruction return Syntaxe ReturnStatement : return ; return [pas de LineTerminator ici] Expression ;
Sémantique
Un programme ECMAScript est considéré comme syntaxiquement incorrect s'il contient une instruction de retour qui ne se trouve pas dans un FunctionBody. A déclaration de retour fait en sorte qu'une fonction cesse son exécution et renvoie une à l'appelant. Si l'expression est omise, la valeur de retour est indéfinie. Sinon, la valeur de retour est la valeur de Expression.
Un ReturnStatement est évalué comme suit :
Si l'Expression n'est pas présente, retour (return, undefined, empty)
. Soit exprRef
être le résultat de l'évaluation de l'expression. Retourner (return, GetValue(exprRef), empty)
.
Donc, à cause de la spécification, votre exemple se lit comme suit :
return ( GetValue(exprRef) )
où exprRef = console.log(a + b), console.log(arguments)
Ce qui, selon le spec sur l'opérateur virgule ...
Sémantique
La production Expression : Expression , AssignmentExpression est évaluée comme suit :
Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
...signifie que chaque expression sera évaluée jusqu'au dernier élément de la liste à virgule, qui devient l'expression d'affectation. Donc votre code return (console.log(a + b) , console.log(arguments))
va
1.) imprimer le résultat de a + b
2.) Il ne reste rien à exécuter, alors on exécute l'expression suivante qui
3.) imprime le arguments
et parce que console.log()
ne spécifie pas de déclaration de retour
4.) Évalue à une valeur indéfinie
5.) Qui est ensuite renvoyé à l'appelant.
Donc la bonne réponse est, return
n'a pas de type, il renvoie seulement le résultat d'une expression.
Pour la prochaine question :
Ainsi, nous pouvons passer des expressions séparées par des virgules dans l'instruction de retour. Est-ce une fonction ?
Non. La virgule en JavaScript est un opérateur, défini pour vous permettre de combiner plusieurs expressions sur une seule ligne, et est définie par la spécification pour renvoyer l'expression évaluée de ce qui est le dernier dans votre liste.
Tu ne me crois toujours pas ?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
Jouez avec ce code ici et s'amuser avec la dernière valeur de la liste. Il retournera toujours la dernière valeur de la liste, dans votre cas il s'agit de undefined.
Pour votre dernière question,
Et en commençant par ça, peut-on supposer que tous les mots clés en JavaScript sont en fin de compte une fonction ?
Encore une fois, non. Les fonctions ont une définition très spécifique dans la langue. Je ne la reproduirai pas ici car cette réponse devient déjà extrêmement longue.