我理解回调函数的本质是该函数作为参数传递给另一个函数后再次执行。但是,我对回调函数中的变量来自何处感到困惑,如下面的 node.js 示例所示:
router.get('/', function(req, res){
res.render('index', {});
});
变量 req 和 res 是如何填充的?一个解释我如何只调用 res.render(...) 而不声明 res 自己的例子将不胜感激。
我理解回调函数的本质是该函数作为参数传递给另一个函数后再次执行。但是,我对回调函数中的变量来自何处感到困惑,如下面的 node.js 示例所示:
router.get('/', function(req, res){
res.render('index', {});
});
变量 req 和 res 是如何填充的?一个解释我如何只调用 res.render(...) 而不声明 res 自己的例子将不胜感激。
它们来自调用普通非回调函数时的相同位置,在调用时。
如果你有这个功能,
function add (a, b) {
return a + b
}
当您调用 add 时,知道 a 和 b 来自于您就可以了,
add(1,2)
这与回调的原理相同,不要因为稍后调用它而让您的大脑变得扭曲。
在某些时候,您传递给 router.get 的函数将被调用,当调用时,它将接收req
和res
。
让我们假设 router.get 的定义是这样的
router.get = function(endpoint, cb){
//do something
var request = {}
var response = {}
cb(request, response) // invocation time
}
在您的示例的情况下,只要.get
被调用,节点就可以传递您的函数请求和响应。
回调的全部意义在于被调用的函数将其回调。
在 的情况下router.get
,它将在查找表中插入路由(路径、方法、回调);当请求进来时,Express 将构造响应对象,将请求的路径和方法与查找表中的所有条目进行匹配,从匹配的条目中获取回调并调用callback(request, response)
(传递检测到的请求和创建的响应)。
它们由调用回调的任何代码填充。在您的示例中,这是 Express 框架内部的一些内容,尽管 Express 在幕后使用了节点http
库并为其提供的请求和响应对象添加了额外的功能。
但是在您编写的代码中,您可以创建一个回调函数签名,该签名接受您想要的任何参数。