0

コードがどのように機能するか、結果の観点から理解しています。まず、乱数を取得し、次に、Math.floor()を使用してMath.Randomの結果を切り捨てます。したがって、コード内を右から左に移動します。

Math.floor(Math.Random * num);

この URLのJavaScriptリファレンスで、下の画像に示されています url

ドットと括弧の場合、結合性は「左から右」であると書かれています。ただし、上記で抜粋したコードに基づくと、「右から左」だったと思います。説明してください

4

2 に答える 2

3

演算子の結合性は、実行順序とは関係ありませんが、解析方法とは関係ありません。

結合性 「左から右」とは、a.b.c === (a.b).c !== a.(b.c).

関数呼び出しがある場合、もちろん引数が最初に評価されます (少なくとも JS のような非遅延言語では) - これも仕様で定義されています。

ここで何が起こるか:

  • Math.floor(Math.Random * num);演算子の優先順位と結合規則に従って、 ASTに解析されます。

-\ invocation
 +-\ function: member operator
 | +-- base: variable "Math"
 | +-- property: "floor"
 +-\ arguments list
   +-\ first: Multiplication
     +-\ left operand: member operator
     | +-- base: variable "Math"
     | +-- property: "Random"
     +-- right operand: variable "num"
  • 評価されるときは、トップダウンで行われます。呼び出しは、最初にその関数を評価し、メンバー演算子をMathandで呼び出しfloorます。これは有効な関数に評価されるため、引数の評価に進みます。乗算は最初に左オペランドをフェッチし、andのメンバー演算子からundefinedを取得します。次に、変数の値をフェッチします。これにより が発生し、これで floor-function が呼び出され、再び返されます。MathRandomnumNaNNaN
于 2012-12-12T22:45:31.073 に答える
1

引数が解決されない限り、関数を呼び出すことはできません。これは、演算子の優先順位の問題ではありません (ただし、実行順序)。関数呼び出しが左結合である理由は、たとえば次の呼び出しを適切に機能させるためです。

foo.bar.baz()

演算子が左結合の場合、これは次のようになります。

((foo.bar).baz)()

これは元のコードと同じです。右結合の場合は、次のようになります。

foo.(bar.(baz())

それは明らかにまったく異なることをすることになり、まったく機能しない可能性が高くなります。

ところで、関数呼び出しは、メンバー演算子とは異なる優先レベルにあります。質問でリンクしたものよりも、このトピックに関するより良いリファレンスについては、MDNを参照してください。

于 2012-12-12T22:40:20.950 に答える