Estou um pouco chocado que ninguém aqui tenha feito referência direta à especificação :
12.9 A sintaxe da instrução return ReturnStatement: return; return [sem LineTerminator aqui] Expression;
Semântica
Um programa ECMAScript é considerado sintaticamente incorreto se contém uma instrução de retorno que não está dentro de um FunctionBody. Uma instrução de retorno faz com que uma função cesse a execução e retorne um valor ao chamador. Se Expression for omitido, o valor de retorno será indefinido. Caso contrário, o valor de retorno é o valor de Expression.
Um ReturnStatement é avaliado da seguinte forma:
Se a Expressão não estiver presente, retorne (return, undefined, empty)
. Deixe exprRef
ser o resultado da avaliação da Expressão. Retorno (return, GetValue(exprRef), empty)
.
Então, por causa da especificação, seu exemplo lê:
return ( GetValue(exprRef) )
Onde
exprRef = console.log(a + b), console.log(arguments)
Que de acordo com as especificações do operador vírgula ...
Semântica
A produção Expression: Expression, AssignmentExpression é avaliada da seguinte forma:
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 expressão será avaliada até o último item da lista de vírgulas, que se torna a expressão de atribuição. Então, seu códigoreturn (console.log(a + b) , console.log(arguments))
vai
1.) imprimir o resultado de a + b
2.) Nada é deixado para executar, então execute a próxima expressão que
3.) imprime o arguments
, e porqueconsole.log()
não especifica uma instrução de retorno
4.) Avalia como indefinido
5.) Que é então devolvido ao chamador.
Portanto, a resposta correta é, return
não tem um tipo, só retorna o resultado de alguma expressão.
Para a próxima pergunta:
Portanto, podemos passar expressões separadas por vírgulas para a instrução de retorno. Isso é uma função?
Não. A vírgula em JavaScript é um operador, definido para permitir que você combine várias expressões em uma única linha, e é definida pela especificação para retornar a expressão avaliada do que quer que seja por último em sua lista.
Você ainda não acredita em mim?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
Brinque com esse código aqui e mexa com o último valor da lista. Ele sempre retornará o último valor da lista, no seu caso, éundefined.
Para sua pergunta final,
E começando com isso, podemos adivinhar que todas as palavras-chave em JavaScript são, em última análise, uma função?
Novamente, não. As funções têm uma definição muito específica na linguagem. Não vou reimprimi-lo aqui porque essa resposta já está ficando extremamente longa.