在 JavaScript 中修改函数参数是一种不好的做法吗
Is it a bad practice to modify function arguments in JavaScript
我正在编写 Node.js 应用程序。还有一些地方我必须修改函数的参数。例如,这个 Express 中间件用于将用户添加到请求中以便我稍后查看它:
exports.fetchUserDetails = function (req, res, next) {
httprequest(opts, function (err, res, body) {
req.user = body.user;
next()
}
}
问题是,我开始使用静态代码分析器 (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 };
但我真的看不出还有其他方法可以在不重新分配参数的情况下重构我的中间件。
所以我的问题是:
- 什么时候可以使用参数重新分配?
- 如何重构我的中间件来避免这种情况? (或者我应该保持原样)
我认为在这种情况下没问题。您正在设置处理请求的后续函数将使用的状态。
linters 抱怨这个的原因是,调用函数时通常不清楚,它会修改其参数,导致错误,如您在问题中所述。
但是在这种情况下,你的函数只有一个调用者,即 express 框架,而且你的函数将在什么情况下被调用总是很清楚,所以我认为这不是问题。
您提供的示例不包括重新分配函数参数。
exports.fetchUserDetails = function (req, res, next) {
httprequest(opts, function (err, res, body) {
req.user = body.user;
next()
}
}
您只需将新字段附加到 req
引用,但不会覆盖 req
本身。
Express中间件从一开始就是采用这种方式,没有错。
我正在编写 Node.js 应用程序。还有一些地方我必须修改函数的参数。例如,这个 Express 中间件用于将用户添加到请求中以便我稍后查看它:
exports.fetchUserDetails = function (req, res, next) {
httprequest(opts, function (err, res, body) {
req.user = body.user;
next()
}
}
问题是,我开始使用静态代码分析器 (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 };
但我真的看不出还有其他方法可以在不重新分配参数的情况下重构我的中间件。
所以我的问题是:
- 什么时候可以使用参数重新分配?
- 如何重构我的中间件来避免这种情况? (或者我应该保持原样)
我认为在这种情况下没问题。您正在设置处理请求的后续函数将使用的状态。
linters 抱怨这个的原因是,调用函数时通常不清楚,它会修改其参数,导致错误,如您在问题中所述。
但是在这种情况下,你的函数只有一个调用者,即 express 框架,而且你的函数将在什么情况下被调用总是很清楚,所以我认为这不是问题。
您提供的示例不包括重新分配函数参数。
exports.fetchUserDetails = function (req, res, next) {
httprequest(opts, function (err, res, body) {
req.user = body.user;
next()
}
}
您只需将新字段附加到 req
引用,但不会覆盖 req
本身。
Express中间件从一开始就是采用这种方式,没有错。