Estoy un poco sorprendido de que nadie aquí haya hecho referencia directa a la especificación :
12.9 La sintaxis de la instrucción return ReturnStatement: return; return [no LineTerminator aquí] Expresión;
Semántica
Un programa ECMAScript se considera sintácticamente incorrecto si contiene una declaración de retorno que no está dentro de FunctionBody. Una declaración de retorno hace que una función deje de ejecutarse y devuelva un valor al llamador. Si se omite Expresión, el valor de retorno no está definido. De lo contrario, el valor de retorno es el valor de Expresión.
Un ReturnStatement se evalúa de la siguiente manera:
Si la expresión no está presente, regrese (return, undefined, empty)
. Sea exprRef
el resultado de evaluar Expression. Regreso (return, GetValue(exprRef), empty)
.
Entonces, debido a la especificación, su ejemplo dice:
return ( GetValue(exprRef) )
dónde
exprRef = console.log(a + b), console.log(arguments)
Que de acuerdo con la especificación del operador de coma ...
Semántica
La producción Expression: Expression, AssignmentExpression se evalúa de la siguiente manera:
Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
... significa que cada expresión se evaluará hasta el último elemento de la lista de comas, que se convierte en la expresión de asignación. Entonces tu código return (console.log(a + b) , console.log(arguments))
va a
1.) imprime el resultado de a + b
2.) No queda nada por ejecutar, así que ejecute la siguiente expresión que
3.) imprime arguments
, y porque console.log()
no especifica una declaración de devolución
4.) Evalúa como indefinido
5.) Que luego se devuelve a la persona que llama.
Entonces, la respuesta correcta es, return
no tiene un tipo, solo devuelve el resultado de alguna expresión.
Para la siguiente pregunta:
Entonces, podemos pasar expresiones separadas por comas en la declaración de retorno. ¿Es esta una función?
No. La coma en JavaScript es un operador, definido para permitirle combinar múltiples expresiones en una sola línea, y está definida por la especificación para devolver la expresión evaluada de lo que sea el último en su lista.
¿Aún no me crees?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
Juega con ese código aquí y juega con el último valor de la lista. Siempre devolverá el último valor de la lista, en su caso, resulta serundefined.
Para su pregunta final,
Y comenzando con esto, ¿podemos suponer que cada palabra clave en JavaScript es en última instancia una función?
De nuevo, no. Las funciones tienen una definición muy específica en el lenguaje. No lo volveré a imprimir aquí porque esta respuesta ya se está volviendo extremadamente larga.