「式」と「ステートメント」という用語を文字通りに捉えすぎていると思います。「状態を変更しない式」は、プログラミング言語にとって非常に厳しい要件です。
思考実験:関数呼び出しの7 + 8
代わりに8
var globalVar = 0;
function my8() {
globalVar = globalVar + 1;
return 8;
}
7 + my8()
ステートメントですか、それとも式ですか。ここでは明らかな状態変化はありませんが、それでもmy8
状態変化を実行します。「副作用なし」の定義を使用すると、関数7 + my8()
のコードを分析せずに がステートメントであるか式であるかを判断することは不可能です。my8
もちろん、関数呼び出しの一部として状態の変更を単純に禁止することは可能ですが、それは JavaScript の方法ではありません。
私の経験では、ほとんどの言語は「値を返すものすべて」を式とステートメントとして定義し、それ以外はすべてステートメントとして定義しています。
「Mozilla が JS でこの 2 つを区別しないのはなぜですか?」という質問に答えるには:
そうだと思いますが、あなたが期待した方法ではありません。「値を返すものすべて」を考慮するには、式が最も実用的なアプローチのようです。
また、同時にステートメントと式であるコードのチャンクの間に矛盾はありません。これは、Javascript や他の多くの言語が機能する方法です。もちろん、これら 2 つの間にもっと厳密な線を引くことは常に可能です。
例:
割り当ては値を返すため、これが可能です。
a = b = c = 1;
より明白な形式で書くことができます:
a = (b = (c = 1));
そのため、割り当ては式 (およびステートメント) と見なされます。
一方で:
if (true) { };
は値を返さない (Javascript で!) ため、式ではありません (ただしステートメントです)。