Jestem trochę zszokowany, że nikt tutaj nie odniósł się bezpośrednio do specyfikacji :
12.9 Składnia instrukcji return ReturnStatement: return; return [tu nie ma LineTerminator] Expression;
Semantyka
Program ECMAScript jest uważany za niepoprawny składniowo, jeśli zawiera instrukcję powrotu, której nie ma w obiekcie FunctionBody. Instrukcja return powoduje, że funkcja przerywa wykonywanie i zwraca wartość do obiektu wywołującego. Jeśli pominięto wyrażenie, wartość zwracana jest niezdefiniowana. W przeciwnym razie zwracana wartość jest wartością wyrażenia.
Wartość ReturnStatement jest szacowana w następujący sposób:
Jeśli wyrażenie nie jest obecne, zwróć (return, undefined, empty)
. Niech exprRef
będzie wynikiem oceny Wyrażenie. Wróć (return, GetValue(exprRef), empty)
.
Tak więc, ze względu na specyfikację, Twój przykład brzmi:
return ( GetValue(exprRef) )
gdzie
exprRef = console.log(a + b), console.log(arguments)
Który zgodnie ze specyfikacją operatora przecinka ...
Semantyka
Wyrażenie produkcji: Expression, AssignmentExpression jest oceniane w następujący sposób:
Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
... oznacza, że każde wyrażenie zostanie ocenione, aż do ostatniego elementu na liście przecinków, który stanie się wyrażeniem przypisania. Więc twój kod return (console.log(a + b) , console.log(arguments))
będzie
1.) wydrukować wynik a + b
2.) Nic nie zostało do wykonania, więc wykonaj następne wyrażenie which
3.) drukuje arguments
, a ponieważ console.log()
nie określa instrukcji return
4.) Ocenia jako niezdefiniowany
5.) Który jest następnie zwracany dzwoniącemu.
Więc prawidłowa odpowiedź brzmi, return
nie ma typu, zwraca tylko wynik jakiegoś wyrażenia.
Na następne pytanie:
Więc możemy przekazać wyrażenia oddzielone przecinkami do instrukcji return. Czy to jest funkcja?
Nie. Przecinek w JavaScript jest operatorem zdefiniowanym w celu umożliwienia łączenia wielu wyrażeń w jeden wiersz i jest definiowany przez specyfikację w celu zwrócenia wartościowanego wyrażenia tego, co jest ostatnie na liście.
Nadal mi nie wierzysz?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
Zagraj z tym kodem tutaj i pomieszaj z ostatnią wartością na liście. Zawsze zwróci ostatnią wartość na liście, w twoim przypadku tak się stanieundefined.
Na twoje ostatnie pytanie,
A zaczynając od tego, czy możemy zgadnąć, że każde słowo kluczowe w JavaScript jest ostatecznie funkcją?
Znowu nie. Funkcje mają bardzo specyficzną definicję w języku. Nie będę go tutaj przedrukowywać, ponieważ ta odpowiedź jest już bardzo długa.