Javascript 运算符优先级和与Math.Floor(Math.Random())的关联性

Javascript 运算符优先级和与Math.Floor(Math.Random())的关联性,javascript,Javascript,从代码给出的结果来看,我理解代码是如何工作的。首先,它得到一个随机数,然后,使用Math.floor()对Math.random的结果进行取整。因此,它在代码中从右向左移动 Math.floor(Math.Random * num); 在此处的JavaScript引用中,如下图所示 它说,对于点和圆括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说它是“从右到左”。请解释一下,如果不解析函数的参数,就不能调用函数。这不是运算符优先级的问题(而是执行顺序)。函数调用为左关联的原因是

从代码给出的结果来看,我理解代码是如何工作的。首先,它得到一个随机数,然后,使用Math.floor()对Math.random的结果进行取整。因此,它在代码中从右向左移动

Math.floor(Math.Random * num);
在此处的JavaScript引用中,如下图所示


它说,对于点和圆括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说它是“从右到左”。请解释一下,如果不解析函数的参数,就不能调用函数。这不是运算符优先级的问题(而是执行顺序)。函数调用为左关联的原因是为了使以下调用正常工作:

foo.bar.baz()
当运算符为左关联时,这等于

((foo.bar).baz)()
这等于原始代码。如果是正确的,您将得到以下结果:

foo.(bar.(baz())
这显然会做一些完全不同的事情,很可能根本不起作用


顺便说一下,函数调用的优先级与成员运算符的优先级不同。有关此主题的参考资料,请参阅,以获得比您在问题中链接的更好的参考资料。

函数在未解析其参数的情况下无法调用。这不是运算符优先级的问题(而是执行顺序)。函数调用为左关联的原因是为了使以下调用正常工作:

foo.bar.baz()
当运算符为左关联时,这等于

((foo.bar).baz)()
这等于原始代码。如果是正确的,您将得到以下结果:

foo.(bar.(baz())
这显然会做一些完全不同的事情,很可能根本不起作用

顺便说一下,函数调用的优先级与成员运算符的优先级不同。有关此主题的参考信息,请参阅,以获得比您在问题中链接的主题更好的参考信息。

与它们的执行顺序无关,但与它们的解析方式无关

关联性“从左到右”表示
a.b.c==(a.b.c!==a、 (b.c)

当您进行函数调用时,当然会首先计算参数(至少在JS这样的非惰性语言中是如此)——这也是在中定义的

这里发生的是:

  • Math.floor(Math.Random*num)被解析为:

  • 评估时,它是自上而下的。调用首先评估其函数,在
    Math
    floor
    上调用成员操作符。当它计算为有效函数时,它将继续计算参数。乘法将首先获取其左操作数,从
    Math
    Random
    上的成员运算符获取未定义的操作数;然后它获取变量
    num
    的值。这将导致
    NaN
    ,现在将使用它调用floor函数,再次返回
    NaN
    • 与它们的执行顺序无关,但与它们的解析方式无关

      关联性“从左到右”表示
      a.b.c==(a.b.c!==a、 (b.c)

      当您进行函数调用时,当然会首先计算参数(至少在JS这样的非惰性语言中是如此)——这也是在中定义的

      这里发生的是:

      • Math.floor(Math.Random*num)被解析为:

      • 评估时,它是自上而下的。调用首先评估其函数,在
        Math
        floor
        上调用成员操作符。当它计算为有效函数时,它将继续计算参数。乘法将首先获取其左操作数,从
        Math
        Random
        上的成员运算符获取未定义的操作数;然后它获取变量
        num
        的值。这将导致
        NaN
        ,现在将使用它调用floor函数,再次返回
        NaN

      关联性!=执行顺序从右到左表示:
      Math.(floor(num))
      带有错误“floor is undefined”关联性!=从右到左的执行顺序表示:
      Math.(floor(num))
      错误为“floor未定义”