根据它给出的结果,我理解代码是如何工作的。首先,它获得一个随机数,然后,使用Math.floor(),它会向下舍入Math.Random的结果。因此,它通过代码从右向左移动。
Math.floor(Math.Random * num);
在此url的JavaScript参考中,如下图所示
它说,对于点和括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说这是“从右到左”。请解释
答案 0 :(得分:3)
associativity of operators与执行顺序无关,但是如何解析它们。
关联性“从左到右”意味着a.b.c === (a.b).c !== a.(b.c)
。
当你有一个函数调用时,当然首先评估参数(至少在JS之类的非惰性语言中) - 这也在specification中定义。
这里发生的是:
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
和floor
上调用成员运算符。当评估为vaild函数时,它会继续评估参数。乘法将首先获取其左操作数,从Math
和Random
上的成员运算符获取 undefined ;然后它获取变量num
的值。这导致NaN
,现在将调用floor函数,再次返回NaN
。答案 1 :(得分:1)
如果不解析其参数,则无法调用函数。这不是运算符优先级(而是执行顺序)的问题。函数调用是左关联的原因是例如以下呼叫正常工作:
foo.bar.baz()
当运算符为左关联时,它等于
((foo.bar).baz)()
等于原始代码。如果它是右关联的,你会得到以下结果:
foo.(bar.(baz())
这显然会做一些完全不同的事情,而这些事情很可能完全不起作用。
顺便说一下,函数调用与成员运算符的优先级不同。有关此主题的更多参考信息,请参阅MDN,而不是您在问题中链接的那个。