Meteor JS箭头函数直接用对象属性作参数报错原因咨询
SWISSEPH.SWE_HOUSES_EX这样的属性表达式? 这个报错其实完全符合JavaScript的语法规则,咱们来拆解一下原因:
首先,不管是箭头函数还是普通函数,参数列表里的每个形参必须是合法的标识符(也就是有效的变量名),或者是解构语法——你不能直接把一个属性访问表达式(比如SWISSEPH.SWE_HOUSES_EX)放在参数位置当形参用。
当你写(SWISSEPH.SWE_HOUSES_EX, flag, ...)的时候,JavaScript引擎会把它当成你试图在参数定义的位置写一个表达式,这完全不符合参数定义的语法逻辑:形参是用来定义“接收值的变量名”的,而SWISSEPH.SWE_HOUSES_EX是一个用来读取对象属性的表达式,它不是一个合法的变量名,所以引擎会抛出Invalid left-hand side in arrow function parameters的错误。
而你把SWISSEPH.SWE_HOUSES_EX赋值给x之后,x是一个标准的标识符,用它作为形参就完全符合语法要求了——这时候x只是一个变量名,用来接收你传入的实参(刚好这个实参是SWISSEPH.SWE_HOUSES_EX这个函数)。
举个更简单的例子类比:你不能写function foo(obj.prop) {},但你可以写const prop = obj.prop; function foo(prop) {},道理是一模一样的。
如果你的场景是想给参数设置默认值(比如默认用SWISSEPH.SWE_HOUSES_EX),那倒是可以这么写:
const calc_longitudes_of_upagrahas = ( x = SWISSEPH.SWE_HOUSES_EX, flag, latitude, longitude, array_of_juls , index, obj ) => {};
但这和你原本想把该函数作为实参传入的场景不同,所以还是得先把属性值赋值给一个标识符再用。
总结一下:你的直觉偏差是因为混淆了“表达式的使用场景”和“参数定义的语法规则”——属性访问表达式可以在赋值、函数调用实参等表达式上下文里用,但不能直接作为形参名称来定义。
内容的提问来源于stack exchange,提问作者preston

