如何在jquery中保留'this'的上下文

时间:2009-06-25 12:05:59

标签: javascript jquery this

我有这样的事情:

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();
  });
}

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

6 个答案:

答案 0 :(得分:14)

您找到的解决方案是大多数人使用的解决方案。常见的惯例是将你的tempThis变量称为“那个。”

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

仅供参考,next version of JQuery

可以控制这种情况

答案 3 :(得分:0)

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

JRH

答案 4 :(得分:0)

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

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

    this.materials = 2000;

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

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

答案 5 :(得分:0)

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

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

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

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

有关详细信息,请参阅Mozilla Documentation on Function.prototype.bind()

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