2009-06-25 46 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(),但創建一個變量來保持這樣的背景下是根據你的問題的不良影響。