我试图从具有特定<p>Hello, </p> <p>my name is John.</p>
对象的require
d Node模块调用方法。据我所知,有三种方法可以执行此操作:.bind(obj)(args)
,.call(obj, arg1, ...)
或.apply(obj, aryArgs)
。我目前正在使用this
,但我已经尝试了所有这三个相同级别的不成功。
这是我正在进行通话的地方:
bind
var library = require("./library.js");
// ...
requestHandler.bind(library)(req);
是对此文件中导出的requestHandler
函数的引用:
status
我希望这样做才能使用exports.status = () => {
console.log(this);
this.render({text: "status ok"});
};
exports.paramSwitching = () => {
this.render("rendered via param switching");
};
exports.json = () => {
this.render({json: {this: 'renders', as: 'json'}});
};
exports.view = () => {
this.render({view: true, locals: {text: 'hi'}});
};
作为status
对象调用library
函数,因为this
所在的位置render
被定义为。但是,console.log
语句显示this
作为持有status
的文件的评估内容,即
{ status: [Function],
paramSwitching: [Function],
json: [Function],
view: [Function] }
这里发生了什么,我该如何解决? (或者,如果我不能因为Node做了一些奇怪的事情,是否有解决方法?)
答案 0 :(得分:1)
箭头函数本身已经将函数体函数中的this
绑定到它所定义的上下文的this
。因此,您无法使用任何这些方法更改this
如果您需要更改this
,则无法使用箭头功能。
答案 1 :(得分:1)
您的请求处理程序使用箭头表示法声明:
exports.status = () => {
console.log(this);
this.render({text: "status ok"});
};
按照设计,箭头符号在声明函数时捕获this
。这几乎就像你这样做了:
exports.status = (function(){
console.log(this);
this.render({text: "status ok"});
}).bind(this);
这意味着status()
函数已绑定且无法反弹。解决方案是停止使用箭头功能:
exports.status = function(){
console.log(this);
this.render({text: "status ok"});
};
答案 2 :(得分:1)
在我发布这个问题后立即想出来。我在包含status
的文件中使用了箭头函数,do not create their own this
scope但是使用了封闭的上下文。
在这些函数上调用bind
,call
或apply
无效,因为this
已经设置为函数的封闭上下文,在这种情况下是eval&#d;文件。
将箭头功能切换为常规功能(将() =>
更改为function ()
)已解决此问题。