在函数内声明一个函数--javascript

时间:2018-04-13 18:14:43

标签: javascript redux

我试图在redux中构建一个中间件来处理api请求。

在寻找灵感时,我找到了这段代码:  redux api middleware

export default store => next => action => {
  const callAsync = action[CALL_API];

  if(typeof callAsync === 'undefined') {
    return next(action);
  }

  .
  .
  .

  function actionWith(data) {
    const finalAction = assign({}, action, data);
    delete finalAction[CALL_API];

    return finalAction;
  }

  next(actionWith({ type: types.REQUEST }));
  .
  .
  .
}

我的问题是:为什么函数actionWith在主函数内部被解析?如果函数在外面被解析并且还会将函数传递给action对象,那么它会不会更简单?

这有什么好处?

1 个答案:

答案 0 :(得分:2)

  

如果函数在外面被解析并且还会将函数传递给action对象,那会不会更简单?

你是对的:只要你提供actionWith作为参数(action),就可以在外部函数之外取actionWith(data, action)

功能相同。但是,我主要关注的是可维护性:如果你需要修改内部函数来执行需要外部函数的另一个变量的东西,你需要添加另一个参数。如果函数的任务与外部函数的内部结构紧密相关,那么当你需要修改代码时,保留它可以让你随时访问外部函数的变量。

我会平衡额外参数的这种关注(通常有利于保持函数内部)与使代码的其他部分可用的函数的有用性(这有利于将其带到外部,以提高可见性)。例如,如果我有许多外部函数,每个函数都有自己的actionWith内部副本,那么让它们共享actionWith的单个版本会更好。

就是说,如果我有

function outer1(action) {
    function actionWith(data) { ... }
    actionWith(thing);
}

function outer2(action) {
    function actionWith(data) { ... }
    actionWith(thing);
}

从可维护性的角度来看,我宁愿拥有

function actionWith(action, data) { ... }

function outer1(action) {
    actionWith(action, thing);
}

function outer2(action) {
    actionWith(action, thing);
}