2016-03-06 62 views
0

我有一个我不太明白的函数。正是在这里:返回函数期间创建的Javascript变量

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

这个函数会得到资源和变量的StatusCode但随后在返回它似乎创建这个实体变量。实体变量不是在这个函数之外的任何地方创建的,所以它是如何创建的?对于全范围的是使用该项目是在这里:

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

+1

这是一个参数。 – SLaks

+1

'responseWithResult()'返回一个函数(一个确切的闭包),函数有参数。 'entity'是返回函数的参数。 – Thomas

回答

1

responseWithResult()返回,当你调用它的功能。

当稍后调用返回的函数时,该调用者应该传递参数entity。由于关闭,该内部功能将有权访问res,statusCodeentity。当调用responseWithResult()时,前两个作为参数传递。当返回的函数被调用时,最后一个被作为参数传递。

所以,这将被用于这样的:

var fn = responseWithResult(res, someStatus); 

// then some time later 
fn(someEntityValue); 
+0

它非常有意义。我觉得,因为我花了很多时间来看这个功能,我忘了看到大局。现在,我只是想确保我明白这一点。返回函数传递原始调用者的信息,因为它嵌套在responseWithResult函数内部,所以它也可以访问res和状态码。在这种情况下,res和entity似乎是同一个变量。这是否准确? – Luidelaparra

+0

@Luidelaparra - 'res'和'entity'是不同的参数。两者都在内部函数中可用。在Javascript中,内部函数自动访问任何父级作用域中的任何变量。它们不被“传递”到内部函数中,而是在函数中简单访问,它们是“范围内的” – jfriend00

+0

谢谢,我猜想通过是错误的词语,我的意思是使用可访问的。函数可以访问这些参数,我非常感谢你回答我的问题,我不想占用更多的时间,但也许你可以澄清实体的用法,如果我调用responseWithResult(res),responseWithResult设置statusCode,然后调用返回函数传入的实体中,我认为会是res。这是不正确的吗?再次感谢您的时间。 – Luidelaparra

0

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

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

你会调用该函数是这样的:

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

或者这样:

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