2

Mozilla の JavaScript ガイドの次の記事を参照してください。

ステートメント

式も割り当てステートメントと見なされます。実際、2 番目の記事では、「任意の式もステートメントである」と読むことができます。他のプログラミング言語に精通していたので、式は常に値ですが、ステートメントのように副作用を引き起こすことは決してないと思っていました。つまり、7、7 + 8、"string" などは状態を変更しないため式ですが、a = 7 は変数が定義されている (つまり、状態が変更された) ためステートメントです。 )。

Mozilla が JS でこの 2 つを区別しないのはなぜですか?

4

3 に答える 3

5

「式」と「ステートメント」という用語を文字通りに捉えすぎていると思います。「状態を変更しない式」は、プログラミング言語にとって非常に厳しい要件です。

思考実験:関数呼び出しの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 で!) ため、式ではありません (ただしステートメントです)。

于 2013-08-20T08:03:50.967 に答える
0

Mozilla はこの 2 つを区別していますが、Javascript 構文が違います。

Javascript についてわずかに「特別」な点は次のとおりです。

"任意の式もステートメントです" ,

つまり、構文でステートメントが必要な場所では、式を直接使用できます (ただし、その逆はできません)。たとえば、以下は有効な Javascript ですが、他の多くの同様の言語では無効です。

if (true) "asfd"

また

foo = function(){
  if (5) { 
    "some text here that won't do anything";
    return true;
    42; // always good to have that one here!
  }
}

一方、ステートメントは式として使用できません。

a = (if (true) 5)   // does not work "unexpected token 'if'"

彼らは、新しいキーワードや構文を導入することなく、厳密モードの仕様にその「機能」を使用しました。関数本体の最初のステートメントとして を追加すると、サポートしているブラウザーで Javascript が厳密モードで実行されます。"use strict"

式は値に評価されますが、通常、ステートメントは評価されません。ほとんどのステートメントは制御フローを変更しますが、通常は式は変更しません (ただし、例外がスローされる結果となる式も制御フローを変更すると主張できます)。Javascript では、式はすべてのステートメントのサブセットを形成します。

于 2013-08-20T10:12:29.767 に答える