Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript回调函数中的参数来自哪里?_Javascript_Node.js - Fatal编程技术网

javascript回调函数中的参数来自哪里?

javascript回调函数中的参数来自哪里?,javascript,node.js,Javascript,Node.js,我理解回调函数的本质,因为该函数作为参数传递给另一个函数后会再次执行。但是,我对回调函数中的变量来自何处感到困惑,如下面的node.js示例所示: router.get('/', function(req, res){ res.render('index', {}); }); 变量req和res是如何填充的?请举例说明如何调用res.render(…)而不声明res,我将不胜感激 它们由调用回调的任何代码填充。在您的示例中,这是Express框架内部的内容,尽管Express在引擎盖下

我理解回调函数的本质,因为该函数作为参数传递给另一个函数后会再次执行。但是,我对回调函数中的变量来自何处感到困惑,如下面的node.js示例所示:

router.get('/', function(req, res){
    res.render('index', {});
});

变量req和res是如何填充的?请举例说明如何调用res.render(…)而不声明res,我将不胜感激

它们由调用回调的任何代码填充。在您的示例中,这是Express框架内部的内容,尽管Express在引擎盖下使用了node
http
库,并为其提供的请求和响应对象添加了其他功能


但在您编写的代码中,您可以创建一个回调函数签名,它接受您想要的任何参数

它们来自于调用时调用普通非回调函数时的同一位置

如果你有这个功能

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将构造响应对象,将请求的路径和方法与查找表中的所有条目相匹配,从匹配条目中获取回调并调用
回调(请求,响应)
(传递检测到的请求和创建的响应).

参数来自节点运行时库。它们响应实际的网络活动,将请求和响应对象放在一起,然后调用回调函数。
参数[1]。呈现(…)
是一个选项。当express检测到/route上的请求时,它将使用req参数和res参数调用您的函数。就像调用常规JavaScript函数一样,比如
functionadd(num1,num2){returnnum1+num2};增加(2+3)Express从开始不再依赖于connect。