2013-09-25 76 views
1

假設的jQuery:jQuery的調整大小失去「這個」參考包括

function FixedPoint(bgWidth) { 
     this.bgWidth= bgWidth; 

     this.plot(); 
     $(window).resize(this.plot); 

    } 

    FixedPoint.prototype.plot = function() { 

     console.log(this.bgWidth); //This is undefined when called by resize 

    } 

    var pt1 = new FixedPoint(1920); 

當圖()被調用構造函數或初始化後一切正常,但是當圖()正在被調整大小稱爲函數,它不能再通過'this'來訪問實例變量。

我可以調用構造函數的外側來修復此問題,但希望在類中保持整齊。

+1

是的,這是預期的。當這個函數作爲事件的回調傳遞時,this裏面是事件的目標。 –

回答

6

$(window).resize(this.plot);方法this.plot正在從window上下文中調用。所以這是預期的行爲。 this將指向窗口對象而不是FixedPoint。您可以使用Ecmascript5 function.bind來顯式綁定上下文。

 $(window).resize(this.plot.bind(this)); 

使用jquery,你可以使用$.proxy來做同樣的事情。

只是爲了給予更多的瞭解,this上下文是根據調用方法的位置(除了綁定函數)設置的。這裏可以從窗口對象的resize方法中調用,其中this指向窗口。

另一個拙劣的方法是使用匿名回調函數並使用緩存這個變量。

function FixedPoint(bgWidth) { 
    this.bgWidth = bgWidth; 
    var self = this; //cache it here 
    $(window).resize(function() { 
     self.plot(); //invoke with self. 
    }); 
} 
+0

不錯,有作品。謝謝。只要stackoverflow讓我接受它。 – Skylervich

+0

@Offspring2099不客氣... – PSL

+0

@Offspring2099閱讀我的答案中粘貼的'bind'鏈接。爲了支持某些瀏覽器,您需要添加墊片。 – PSL