为什么我的这个对象被忽略了?

时间:2017-03-24 12:09:33

标签: javascript node.js this

我试图从具有特定<p>Hello, </p>&nbsp;<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做了一些奇怪的事情,是否有解决方法?)

3 个答案:

答案 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但是使用了封闭的上下文。

在这些函数上调用bindcallapply无效,因为this已经设置为函数的封闭上下文,在这种情况下是eval&#d;文件。

将箭头功能切换为常规功能(将() =>更改为function ())已解决此问题。