0

我了解代码的工作原理,就其给出的结果而言。首先,它获取一个随机数,其次,使用 Math.floor() 将 Math.Random 的结果四舍五入。因此,它在代码中从右向左移动。

Math.floor(Math.Random * num);

在此 url的 JavaScript 参考中,如下图所示 网址

它说,对于点和括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说它是“从右到左”。请解释

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。当 this 评估为有效函数时,它会继续评估参数。乘法将首先获取其左操作数,从成员运算符 on 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 回答