如果我调用这样的函数:
var n = 0; f(n, n += 100)
它的参数值是0和100,而不是100和100,正如我所期望的那样。这种行为是我目前在我的程序中所需要的,但我不明白为什么它以这种方式工作并且让我感到麻烦。
有人可以解释为什么会这样,以及传递这样的参数是否安全?
答案 0 :(得分:4)
在第二个参数值之前评估第一个参数值。
答案 1 :(得分:2)
与C(和Java一样)不同,Javascript 实际上具有定义的参数评估顺序:从左到右。所以,有点令人惊讶的是, 可以安全地编写代码。但是,我认为它的风格非常糟糕,实际上几乎是不可读的,因为没有多少人知道评估顺序是否实际定义(例如:我必须查阅以回答这个问题)。
修改:请参阅第11.2.4节http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
答案 2 :(得分:1)
变量n
是JavaScript中的基本类型(基元类型包括数字,字符串和布尔值)。原始类型按值传递,解释您观察到的行为。如果n
是非基本类型,则它将通过引用传递,对其进行的任何修改都将反映在对n
的所有引用中。
有关其他信息,请参阅JavaScript: Passing by Value or by Reference。