ここで誰も直接仕様を参照していなかったことにちょっとショックです:
12.9 returnステートメントの構文ReturnStatement:return; return [ここにはLineTerminatorはありません]式;
意味論
ECMAScriptプログラムは、FunctionBody内にないreturnステートメントを含む場合、構文的に正しくないと見なされます。returnステートメントにより、関数は実行を停止し、呼び出し元に値を返します。Expressionが省略されている場合、戻り値は未定義です。それ以外の場合、戻り値はExpressionの値です。
ReturnStatementは次のように評価されます。
式が存在しない場合は、を返し(return, undefined, empty)
ます。exprRef
式を評価した結果としましょう。リターン(return, GetValue(exprRef), empty)
。
したがって、仕様により、例では次のようになります。
return ( GetValue(exprRef) )
どこ
exprRef = console.log(a + b), console.log(arguments)
カンマ演算子の仕様によると...
意味論
プロダクション式:Expression、AssignmentExpressionは次のように評価されます。
Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
...すべての式が、割り当て式になるコンマリストの最後の項目まで評価されることを意味します。だからあなたのコードreturn (console.log(a + b) , console.log(arguments))
は
1.)の結果を出力する a + b
2.)実行するものが残っていないため、次の式を実行します。
3.)を出力しarguments
、console.log()
returnステートメントを指定していないため
4.)未定義に評価
5.)その後、呼び出し元に返されます。
したがって、正しい答えは、return
型がなく、式の結果のみを返すことです。
次の質問について:
したがって、コンマ区切りの式をreturnステートメントに渡すことができます。これは機能ですか?
いいえ。JavaScriptのコンマは演算子であり、複数の式を1行に結合できるように定義されており、リストの最後にあるものの評価された式を返すように仕様で定義されています。
あなたはまだ私を信じていませんか?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
ここでそのコードをいじって、リストの最後の値をいじってください。それは常にリストの最後の値を返します、あなたの場合それはたまたまですundefined.
最後の質問は、
そしてこれから始めて、JavaScriptのすべてのキーワードが最終的には関数であると思い込んでみませんか?
繰り返しますが、違います。 関数は、言語で非常に具体的な定義があります。この回答はすでに非常に長くなっているので、ここでは転載しません。