【问题标题】:Is it a bad practice to modify function arguments in JavaScript在 JavaScript 中修改函数参数是一种不好的做法吗
【发布时间】:2017-05-06 18:04:46
【问题描述】:

我正在编写一个 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 };

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

所以我的问题是:

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

【问题讨论】:

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

标签: javascript node.js parameter-passing eslint


【解决方案1】:

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

exports.fetchUserDetails = function (req, res, next) {
  httprequest(opts, function (err, res, body) {
    req.user = body.user;
    next()
  }
}

您只需将新字段附加到 req 引用,但不会覆盖 req 本身。

Express中间件从一开始就是采用这种方式,这并没有错。

【讨论】:

    【解决方案2】:

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

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

    但是在这种情况下,您的函数只有一个调用者,即 express 框架,并且始终清楚您的函数将在什么情况下被调用,所以我认为这不是问题。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多