在 JavaScript 中修改函数参数是一个坏习惯吗

ser*_*off 4 javascript parameter-passing node.js eslint

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

exports.fetchUserDetails = function (req, res, next) {
  httprequest(opts, function (err, res, body) {
    req.user = body.user;
    next()
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我开始使用静态代码分析器(ESLint),它总是抱怨重新分配函数参数(http://eslint.org/docs/rules/no-param-reassign)。我想这条规则的存在是有原因的。

我知道修改函数参数可能会很糟糕,就像这个例子一样:

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

var obj = { a: 1 };
console.log(obj); // outputs { a: 1 };
modifyParam(obj);
console.log(obj); // outputs { a: 2 };
Run Code Online (Sandbox Code Playgroud)

但我真的没有看到在不重新分配参数的情况下重构中间件的其他方法。

所以我的问题是:

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

big*_*ind 5

我认为在这种情况下还好。您正在设置将由处理请求的后续函数使用的状态。

linter 抱怨这一点的原因是,调用函数时通常不清楚,它会修改其参数,从而导致错误,正如您在问题中所描述的那样。

但在这种情况下,你的函数只有一个调用者,即express框架,并且总是很清楚在哪种情况下你的函数将被调用,所以我认为这里不是问题。