我刚刚开始使用node.js(和javascript),可能会有一个基本的误解。以下代码按预期工作。它是从一个带有express的简单API的教程中获得的,除了提取函数以获取数据之外(但是除了信息量较少的堆栈跟踪之外,问题也会发生。)
var express = require('express');
var app = express();
var getdataandsend = function(request,response) {
var res = {a:1,b:2}; // actually sql query using request.params
response.send(res);
}
app.get('/:id', function (request, response) {
getdataandsend(request,response);});
var server = app.listen(1234, function () {});
但是,由于我只是将response
传递给getandsenddata
以便调用其send
方法,因此我想我也可以将引用/指针传递给方法本身,而不是整个对象:
var getdataandsend = function(request,respfun) {
respfun({a:1,b:2});
}
app.get('/:id', function (request, response) {
getdataandsend(request,response.send);});
但这导致以下
TypeError: Cannot read property 'req' of undefined
at send (...\test\node_modules\express\lib\response.js:103:17)
at getdataandsend (...\test\misctest.js:6:9)
at ...\test\misctest.js:9:6
at Layer.handle [as handle_request] (...\test\node_modules\express\lib\router\layer.js:95:5)
...
response.js中的相关行是var req = this.req;
,这是该文件中该名称变量的第一个出现。显然,this
的值在上面的两个调用之间是不同的,即使响应对象的方法send
是从同一个地方调用的(getdataandsend
)。在this answer和that answer之后,如果第一个调用被认为是方法而第二个调用被称为函数调用,则观察到的行为可能有意义,但为什么会出现这种情况呢? send
仍然是response
的方法,不是吗?或者都是函数调用(...然后是什么response
)?
答案 0 :(得分:1)
在 JavaScript 中,每个函数都有一个与之关联的this
对象。这用于存储函数的数据/执行上下文。
对于构造函数或方法,this
对象存储此方法所属对象的公共上下文。
但是,如果函数不是构造函数或方法,则this
对象存储全局上下文,如果是浏览器则为window
,NodeJS为GLOBAL
可以使用原生{{1} 将 函数的this
对象设置为任意上下文 },call
或apply
函数。
您的情况会发生什么,当您将bind
函数发送到response.send
函数时,您实际上是从getdataandsend
函数剥离send
函数this
对象的response
上下文。
因此,当send
函数在内部尝试访问this
上下文中的任何内容时,它会获得undefined
,从而产生错误。