Javascript 无参数重新分配:重新分配参数导致问题的实际例子是什么?

Javascript 无参数重新分配:重新分配参数导致问题的实际例子是什么?,javascript,eslint,Javascript,Eslint,我看到很多关于遵守无参数重新分配林廷规则的最佳实践的问题,但没有/更少的人要求说明该规则的基本原理 像“将变量赋值为函数参数可能会产生误导并导致混淆行为”这样的说法都是好的,但不遵守这一规则会导致哪些实际问题 请注意,我不是在征求关于这个规则是否好的意见。我要求提供这种令人困惑的行为的具体例子,以便我能更好地理解该规则的基本原理。这都是关于最小惊喜原则。现代JavaScript的优点在于,对于非参数变量,如果您看到一个常量变量,您不必分析整个函数来了解它的值,因此您可以更容易地理解代码。简言之,

我看到很多关于遵守无参数重新分配林廷规则的最佳实践的问题,但没有/更少的人要求说明该规则的基本原理

像“将变量赋值为函数参数可能会产生误导并导致混淆行为”这样的说法都是好的,但不遵守这一规则会导致哪些实际问题


请注意,我不是在征求关于这个规则是否好的意见。我要求提供这种令人困惑的行为的具体例子,以便我能更好地理解该规则的基本原理。

这都是关于最小惊喜原则。现代JavaScript的优点在于,对于非参数变量,如果您看到一个常量变量,您不必分析整个函数来了解它的值,因此您可以更容易地理解代码。简言之,它可以让你放松。如果某些东西是用let或var定义的,那么您就知道您有检查代码以进行任何重新分配的心理负担。这就是为什么我个人建议几乎一直避免let或var

不幸的是,对于参数,您没有机会声明它们是否可重新分配。重新分配参数是一种罕见的做法,因为参数和可分配变量的语义现在已合并。就我个人而言,我认为对于较短的函数来说,这并不是什么大不了的事情,但变异真正能让你感到痛苦的是,在较长的函数中,你无法在屏幕上看到所有的代码。假设您正在尝试调试此代码。您会看到一个错误被抛出,就像无效的购买价格一样。您可以在长函数的底部找到该错误消息:

async function purchase(price, tax, roundUp) {
  // ...

  if (typeof price !== 'number') {
    throw new Error('Invalid purchase price');
  }
}
好吧,你可能会说,让我们看看是否有人没有在购买时传递数字。因此,您可以找到购买的所有引用,并在所有情况下追溯第一个参数的来源,奇怪的是,您会得出这样的结论:您的代码经常出没,因为您从未向代码传递非数字价格。但是,您可能忘记了价格可能在函数中随时发生变化,因此您错过了向上滚动并找到:

price = price + tax;
有人将一个非数字传递到tax,导致检查价格参数时出错,这可能需要我们花一些时间来解决

想象一下,如果我们看到:

const totalPrice = price + tax;

/* ... */

if (typeof totalPrice !== 'number') {
  throw new Error('Invalid purchase price');
}
我们现在知道我们需要检查价格和税收参数


这就是他们所谈论的那种令人困惑的行为,也是为什么阻止这种非典型行为是有价值的。

从规则页面链接:@jmargolisvt这部分论证是垃圾,不适用于使用严格模式的现代环境。一般来说,这些参数被视为常量,始终引用传递给函数的值。如果你有一个很长的函数体,有些部分覆盖了参数变量,读者可能会感到困惑。@Quentin-我知道eslint文档-我在我的OP中直接引用了它。如果你仔细阅读我的问题,你会发现文档没有回答它。谢谢,这很有启发性~