为什么传递的方法/函数中的`this`与传递的对象上的方法调用不同

时间:2016-05-03 12:02:03

标签: javascript node.js

我刚刚开始使用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 answerthat answer之后,如果第一个调用被认为是方法而第二个调用被称为函数调用,则观察到的行为可能有意义,但为什么会出现这种情况呢? send仍然是response的方法,不是吗?或者都是函数调用(...然后是什么response)?

1 个答案:

答案 0 :(得分:1)

JavaScript 中,每个函数都有一个与之关联的this对象。这用于存储函数的数据/执行上下文。

对于构造函数或方法,this对象存储此方法所属对象的公共上下文。

但是,如果函数不是构造函数或方法,则this对象存储全局上下文,如果是浏览器则为window,NodeJS为GLOBAL

可以使用原生{{1} 函数的this对象设置为任意上下文 },callapply函数。

Link for more information

您的情况会发生什么,当您将bind函数发送到response.send函数时,您实际上是从getdataandsend函数剥离send函数this对象的response上下文。

因此,当send函数在内部尝试访问this上下文中的任何内容时,它会获得undefined,从而产生错误。