【问题标题】:Javascript variable created during return function在返回函数期间创建的 Javascript 变量
【发布时间】:2016-06-20 07:37:00
【问题描述】:

我有一个我不太了解的功能。在这里:

function responseWithResult(res, statusCode) {
       statusCode = statusCode || 200;
       return function(entity) {
            if (entity) {
           res.status(statusCode).json(entity);
            }
          };
        }

这个函数获得了 res 和 statusCode 变量,但是在返回时它似乎创建了这个实体变量。实体变量不是在这个函数之外的任何地方创建的,那么它是如何在这里创建的呢?使用这个的项目的完整范围在这里:

https://github.com/angular-fullstack/generator-angular-fullstack

【问题讨论】:

  • responseWithResult() 返回一个函数(确切地说是一个闭包),并且函数有参数。 entity 是返回函数的参数。

标签: javascript function rest controller server


【解决方案1】:

responseWithResult() 在调用时返回一个函数。

当稍后调用返回的函数时,调用者应该将entity 参数传递给它。由于关闭,该内部函数将可以访问res、statusCode 和entity。前两个在调用 responseWithResult() 时作为参数传递。最后一个在调用返回的函数时作为参数传递。

所以,这将是这样使用的:

var fn = responseWithResult(res, someStatus);

// then some time later
fn(someEntityValue);

【讨论】:

  • 这很有意义。我觉得因为我花了太多时间看这个功能,我忘了看大局。现在我只想确保我理解这一点。 return 函数从原始调用者那里获得信息,并且因为它嵌套在 responseWithResult 函数中,所以它还可以访问 res 和 status code 。在这种情况下, res 和 entity 似乎是同一个变量。这准确吗?
  • @Luidelaparra - res 和 entity 是不同的参数。两者都在内部函数中可用。在 Javascript 中,内部函数自动访问任何父范围内的任何变量。它们不会“传递”到内部函数,而是可以在函数中简单地访问。它们是“范围内的”。
  • 谢谢。我想通过是错误的词。我的意思是使用可访问性。返回的函数可以访问这些参数。我很感谢你回答我的问题。我不想占用你更多的时间,但也许你可以澄清实体的使用。如果我调用 responseWithResult(res) responseWithResult 设置 statusCode 然后调用返回函数传入我认为是 res 的实体。这是不正确的吗?再次感谢您的宝贵时间。
  • @Luidelaparra - responseWithResult() 不调用内部函数。它将该函数作为返回值返回。 responseWithResult() 的调用者必须获取该返回值,然后调用该函数本身(请参阅我的答案中的代码)。
【解决方案2】:

调用 responseWithResult 返回一个接受实体作为参数的函数。实体不是在函数外部创建的,它是分配给调用返回函数的参数的变量名。

这样做的原因是因为返回的函数可以通过闭包访问 statusCode 和 res。

你可以这样调用这个函数:

responseWithResult('foo', 'bar')('baz');

或者像这样:

var fn = responseWithResult('foo', 'bar');
fn('baz');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2012-06-24
    相关资源
    最近更新 更多