7

我有这样的事情:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}

问题在于匿名函数内部的“this”指的是窗口对象。我知道我可以做类似的事情:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

但是有更好的方法吗?这看起来不是很优雅。

4

6 回答 6

14

您找到的解决方案是大多数人使用的解决方案。通常的约定是将您的 tempThis 变量称为“那个”。

var Something = function(){
  this.render = function(){};
  var that = this;
  $(window).resize(function(){
    that.render();
  });
};
于 2009-06-25T12:14:45.740 回答
2

这看起来是您最好的选择,我认为没有更好的方法。(如果我错了,有人纠正我)。

于 2009-06-25T12:08:58.750 回答
1

仅供参考,控制这一点的能力将出现在JQuery 的下一个版本中

于 2009-06-25T12:19:58.570 回答
0

将变量保持在最低限度的最佳解决方案是使用 Function.prototype.bind() 方法。

var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}

这种方法的问题可能会导致未来的复杂性,这意味着您应该选择谨慎使用它,即当您需要调用$(this)来抓取元素时。因此,我可能建议Function.prototype.bind()在您的调整大小方法中使用它是值得的,但在您可能需要直接定位被点击元素的点击功能中使用它并不是一个好的解决方案。

有关工作示例,请参阅此JSFiddle 。

有关更多信息,请参阅关于 Function.prototype.bind() 的 Mozilla 文档

其他方法是可用的,但是根据您的问题,创建一个变量来维护其上下文是不希望的效果。

于 2014-05-06T14:25:39.537 回答
0

在许多紧张的情况下,我一直在这样做。它看起来并不优雅,但它永远不会失败。实际上,这就是 javascript 闭包的作用。

jrh

于 2009-06-25T12:12:59.677 回答
0

这正是我所做的。它也不是特定于 jQuery 的。

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

请记住在新的作用域变量前面使用 var 关键字。否则,您将创建一个新的全局变量。作为局部变量,它仍然可以通过闭包在内部函数内部访问。

于 2009-06-25T12:21:16.930 回答