快递中的闭包令人困惑

时间:2017-04-19 18:19:09

标签: javascript jquery node.js reactjs express

  • 我是js
  • 的新手
  • 我认为闭包作为内部函数,可以访问外部函数中的变量。
  • 但是在下面的代码中,如果单独的函数可以访问另一个单独的函数,那么它将形成闭包
//separate function
function auth(name) {  
  return function (req, res, next) {
    if (req.isAuthenticated() && name && req.user.name === name) next();
    else if (req.isAuthenticated() && !name) next();
    else res.send(401);
  };
}

//单独的函数但使用auth

app.get('/example/a', auth(), function (req, res) {  
  res.send('Hello from A!');
});

 //separate function but uses auth

app.get('/example/b', auth('Francis'), function (req, res) {  
  res.send('Hello from B!');
});

1 个答案:

答案 0 :(得分:1)

  

但是在下面的代码中,如果单独的函数可以访问另一个单独的函数,它将形成闭包

函数auth返回是对创建它的auth调用的上下文的闭包,这就是为什么即使name它也可以访问auth参数的原因。 }函数被调用时返回。它不是关闭任何其他相关的; reqresnext是它收到的参数,而不是它关闭的内容。

因此,问题中的整体代码会在两个不同的上下文中创建两个闭包(对auth的两次调用各一个)。

如果目标是创建一个函数,使用name稍后在调用它时传递auth,那么该代码就可以了。这是封闭的经典用法。

相关: