演算子の結合性は、実行順序とは関係ありませんが、解析方法とは関係ありません。
結合性 「左から右」とは、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"
- 評価されるときは、トップダウンで行われます。呼び出しは、最初にその関数を評価し、メンバー演算子を
Math
andで呼び出しfloor
ます。これは有効な関数に評価されるため、引数の評価に進みます。乗算は最初に左オペランドをフェッチし、andのメンバー演算子からundefinedを取得します。次に、変数の値をフェッチします。これにより が発生し、これで floor-function が呼び出され、再び返されます。Math
Random
num
NaN
NaN