Je suis un peu choqué que personne ici n'ait directement référencé la spécification :
12.9 La syntaxe de l'instruction return ReturnStatement: return; return [aucun LineTerminator ici] Expression;
Sémantique
Un programme ECMAScript est considéré comme syntaxiquement incorrect s'il contient une instruction return qui ne se trouve pas dans un FunctionBody. Une instruction return provoque l'arrêt de l'exécution d'une fonction et renvoie une valeur à l'appelant. Si Expression est omis, la valeur de retour n'est pas dé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, retournez (return, undefined, empty)
. Soit exprRef
le résultat de l'évaluation d'Expression. Retour (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)
Qui selon la spécification sur l'opérateur virgule ...
Sémantique
L'expression de production: 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 de virgules, qui devient l'expression d'affectation. Donc ton codereturn (console.log(a + b) , console.log(arguments))
va
1.) imprimer le résultat de a + b
2.) Il ne reste plus rien à exécuter, alors exécutez l'expression suivante qui
3.) imprime le arguments
, et parce queconsole.log()
ne spécifie pas une instruction de retour
4.) Évalue à undefined
5.) Qui est ensuite renvoyé à l'appelant.
Donc la bonne réponse est, return
n'a pas de type, elle ne renvoie que le résultat d'une expression.
Pour la question suivante:
Ainsi, nous pouvons passer des expressions séparées par des virgules dans l'instruction return. Est-ce une fonction?
Non. La virgule en JavaScript est un opérateur, défini pour vous permettre de combiner plusieurs expressions en une seule ligne, et est défini par la spécification pour renvoyer l'expression évaluée de ce qui est en dernier dans votre liste.
Vous ne me croyez 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 dérangez la dernière valeur de la liste. Il renverra toujours la dernière valeur de la liste, dans votre cas, il se trouve que c'estundefined.
Pour votre dernière question,
Et en commençant par cela, pouvons-nous supposer que chaque mot-clé en JavaScript est finalement une fonction?
Encore une fois, non. Les fonctions ont une définition très spécifique dans la langue. Je ne la réimprimerai pas ici car cette réponse devient déjà extrêmement longue.