在JavaScript中修改函数参数是一种不好的做法吗

在JavaScript中修改函数参数是一种不好的做法吗,javascript,node.js,parameter-passing,eslint,Javascript,Node.js,Parameter Passing,Eslint,我正在编写一个Node.js应用程序。有些地方我必须修改函数的参数。例如,此Express中间件用于将用户添加到请求,以便我以后可以查看: exports.fetchUserDetails = function (req, res, next) { httprequest(opts, function (err, res, body) { req.user = body.user; next() } } 问题是,我开始使用静态代码分析器(ESLint),它总是抱怨重新分

我正在编写一个Node.js应用程序。有些地方我必须修改函数的参数。例如,此Express中间件用于将用户添加到请求,以便我以后可以查看:

exports.fetchUserDetails = function (req, res, next) {
  httprequest(opts, function (err, res, body) {
    req.user = body.user;
    next()
  }
}
问题是,我开始使用静态代码分析器(ESLint),它总是抱怨重新分配函数参数()。我想这条规则是有原因的

我知道修改函数参数可能不好,如本例所示:

function modifyParam(param) {
  param.a = 2
}

var obj = { a: 1 };
console.log(obj); // outputs { a: 1 };
modifyParam(obj);
console.log(obj); // outputs { a: 2 };
但我真的不知道重构中间件而不重新分配参数的其他方法

所以我的问题是:

  • 何时可以使用参数重新分配
  • 如何重构中间件以避免这种情况?(或者我应该保持原样)

    • 我想在这种情况下没关系。您正在设置处理请求的后续函数将使用的状态

      linters对此抱怨的原因是,调用函数时往往不清楚它是否会修改其参数,从而导致错误,正如您在问题中所述


      但在本例中,您的函数只有一个调用者,即express框架,在什么情况下调用您的函数总是很清楚的,所以我认为这不是一个问题。

      您提供的示例不包括重新分配函数参数

      exports.fetchUserDetails = function (req, res, next) {
        httprequest(opts, function (err, res, body) {
          req.user = body.user;
          next()
        }
      }
      
      您只需将新字段附加到
      req
      引用,但不覆盖
      req
      本身


      Express中间件从一开始就使用这种方法,这没有什么不对。

      为什么你认为这个例子不好?