2009-06-25 35 views
7

我有这样的事情:我如何保持的背景下“这个” jQuery中

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

麻烦的是,匿名函数内部“这”指的是window对象。我知道我可以做这样的事情:

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

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

+1

您应该在“tempThis = this”之前放置一个“var”以确保适当的范围。 – Matt 2009-06-25 12:13:42

回答

14

您发现的解决方案是大多数人使用的解决方案。常见的约定是调用你的tempThis变量“那个”。

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

对于那个(: – peirix 2009-06-25 12:15:57

2

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

+0

+1借调。 – jrharshath 2009-06-25 12:12:00

0

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

jrh

0

快到这正是我做什么。它并不特定于jQuery。

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

    this.materials = 2000; 

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

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

0

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

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

用这种方法,可能会导致未来的并发症,这意味着你应该选择谨慎地使用它的问题是,当你需要调用$(this)抢元素。所以,我可能会建议在resize方法中使用Function.prototype.bind()是值得的,但它不是一个很好的解决方案,可以在点击函数中使用它,您可能需要直接定位点击元素。

查看此JSFiddle作为一个工作示例。

了解更多信息

其他方法是可用的,请参阅Mozilla Documentation on Function.prototype.bind(),但创建一个变量来保持这样的背景下是根据你的问题的不良影响。

相关问题