当我使用一个方法作为回调时,它似乎无法访问“this”.为什么?
When I use a method as a callback, it seems to lose access to `this`. Why?
我在Node中使用express
来创建一个简单的web应用程序。代码如下:
var get_stuff = function (callback) {
another.getter(args, function (err, data) {
if (err) throw err;
data = do_stuff_to(data);
callback(data);
});
};
app.get('/endpoint', function (req, res) {
get_stuff(res.send);
});
但是,当我运行此程序时,我会得到以下错误:TypeError: Cannot read property 'method' of undefined at res.send
。中断的快速代码是这样开始的:
res.send = function (body) {
var req = this.req;
var head = 'HEAD' == req.method;
在我看来,我构建回调的方式是在send
方法中丢失this
。但我不知道该怎么修。有什么建议吗?谢谢
调用.bind
:
get_stuff(res.send.bind(res));
并查看有关this
的MDN文档以了解其工作原理。this
的值由函数的调用方式决定。称其为"正常"(回调可能会发生什么),如
func();
将CCD_ 8设置为全局对象。仅当函数被调用为对象方法时(或者如果this
被明确设置为使用.bind
、.apply
或.call
),this
指对象:
obj.fun(); // `this` refers to `obj` inside the function
.bind
允许您在不调用函数的情况下指定this
值。它只是返回一个新函数,类似于
function bind(func, this_obj) {
return function() {
func.apply(this_obj, arguments);
};
}
在JavaScript中,this
的值通常由调用站点决定,与Python不同,当稍后调用方法时,通过.
运算符访问方法不会将其左侧绑定到this
。
要执行绑定,您可以像旧答案中那样调用.bind
,也可以手动执行绑定,将方法调用封装在另一个回调中:
get_stuff(function () {
return res.send.apply(res, arguments);
});
从ECMAScript 2018开始,还可以使用胖箭头函数语法和rest参数来使上述内容更加紧凑:
get_stuff((...args) => res.send(...args));
相关文章:
- 为什么在这个网站上不能通过JS访问元素
- 为什么可以't PHP查找可以使用JS或jQuery访问的元素
- 为什么可以't我访问Chrome内置功能$
- 为什么在中声明具有外部访问权限的变量
- 为什么在以下代码段中无法访问中的变量值
- 为什么原型需要通过实例访问
- 为什么可以't在对指令的html调用中访问$rootScope
- 为什么我得到“;错误:预期"同时访问字符串
- 为什么我的HTML似乎无法访问我的javascript
- 为什么我不能在 ajax 成功中访问 $(this)
- 为什么我无法访问使用 $provide.provider 和 $injector.get 创建的服务
- 为什么我不能在javascript中访问这个变量
- 为什么我得到“;访问控制允许起源”;当已经设置了头时,通过AJAX下载文件
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 为什么我的firefox扩展javascript不能访问opener窗口,也看不到window.name
- 为什么可以't我通过ID访问这个动态加载的DOM元素(没有iframe)
- 为什么我可以't使用点表示法访问JSON字典元素
- void(0) 返回 'undefined',但允许属性访问.为什么
- 自执行块内的Javascript函数不可访问.为什么
- DOM属性访问:为什么是"elt.class"不工作