【问题标题】:JS: this reference does not work [duplicate]JS:此参考不起作用[重复]
【发布时间】:2015-07-14 22:30:12
【问题描述】:

我想将某些对象的 Javascript 代码封装在如下所示的结构中。但是,我遇到了this 的语义问题。

虽然在tiles.init() 期间this 指的是tiles 对象,但在事件处理程序中它指的是事件,即我不能使用this 从我的对象中调用其他方法。

有没有办法将对象传递给事件处理程序,这样我就不必使用全局变量来调用我自己的子例程并且仍然保留来自回调的this上下文?

我发了一个JSFiddle here。这是工作的 JS 部分:

myData = {
    'color': "red",
    'makeRed': function(){
        // don't want reference to global here!
        $(this).css("color",myData.color);
    },
    'reset': function(){
        $(this).css("color","");
    },
    'init': function(){
        $("#click").hover(this.makeRed,this.reset);
    }
};

myData.init();

我找到了几个解决方案,例如 thisthis 想法来传递额外的参数。该问题已被标记为与this 重复,但使用.bind() 会浪费回调中jQuery 所需的this

知道如何在不使用全局变量的情况下将事件上下文的tilesthis 都获取到处理函数吗?

【问题讨论】:

  • .hover(this.hoverIn.bind(this), this.hoverOut.bind(this))
  • 我实际上错过了那个答案,但它并没有解决全部问题。它导致了 elclanrs 提出的建议。这会带来这样的图块,但会丢弃事件,即 jQuery $(this) 不再起作用。

标签: javascript jquery this argument-passing


【解决方案1】:

您可以在init 方法中使用闭包变量

'init': function () {
    var self = this;
    $("#tiles div.tile").hover(function () {
        self.hoverIn(this);
    }, function () {
        self.hoverOut(this);
    });
}

您的构造不起作用,因为悬停回调中的 this 未引用 tiles 对象

【讨论】:

  • 这并不能解决问题。 this.hoverIn 在 init 中运行良好!使回调接受设置为 self 的参数,使 $(this) 在回调中失败。
  • 好的,成功了。诀窍在于 function(){self.hoverIn(self,$(this))} 将两个参数都传递给处理程序。在我问这个问题之前我尝试了类似的东西,但肯定做错了什么。感谢您的提示 - bind() 变体对我不起作用。
猜你喜欢
  • 2017-05-11
  • 2013-06-30
  • 2019-03-28
  • 2018-03-21
  • 2017-12-30
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多