2013-04-04 153 views
0

所以,我相對比較新的JavaScript,並仍然有困難讓我的頭一輪變量範圍。所以,我試圖做的是從一個函數外部訪問一個變量(全部在同一個對象內)。從其範圍外訪問變量?

見下文:

function GameCard(imageSource, div) 
{ 
    this.cardImage = new Image(); 
    this.cardImage.src = imageSource; 

    this.imageString = "<img src='" + this.cardImage.src + "' />"; 

    this.hiddenImage = new Image(); 
    this.hiddenImage.src = HIDDEN_SOURCE; 

    this.clicked = false; 

    this.cardDiv = div; 

    $(this.cardDiv).click(function() { 
     alert(this.imageString); 
     $(this).flip({ 
      direction:'lr', 
     }); 
    }); 
} 

警報(我不幸調試)是說和imagestring是單擊處理函數中不確定的。這是有道理的,我將如何訪問它?

由於提前, Ĵ

+0

它可能與一個範圍的問題之內上漲和訪問你的' this' .... – cclerville 2013-04-04 00:26:57

+0

cclerville是正確的,當你在.click()函數中使用'this'時,它實際上是指被點擊的'cardDiv'對象,而不是封裝的'GameCard'對象。 – TheManWithNoName 2013-04-04 00:30:34

回答

2

兩種方式:第一,你可以在另一個變量藏匿this

var saveThis = this; 

之前,設置「點擊」處理程序,然後在使用「saveThis」處理程序代碼:

$(this.cardDiv).click(function() { 
    alert(saveThis.imageString); 
    $(saveThis).flip({ 
     direction:'lr', 
    }); 
}); 

方式二:綁定的處理函數對象你想要的:

$(this.cardDiv).click(function() { 
    alert(this.imageString); 
    $(this).flip({ 
     direction:'lr', 
    }); 
}.bind(this)); 

第二種方式需要舊版本IE中的a shim

+0

這工作,謝謝。只是爲了澄清(如果你不介意)你能解釋發生了什麼?我想我明白@莫比的解釋。只是有點糾結在我的腦海中。 – JohnW 2013-04-04 00:34:05

+0

「magic」僞變量'this'在每個函數**調用**上獲得一個值。它的值取決於函數調用的情況。在你的情況下,jQuery總是試圖確保'this'是事件中涉及的元素(在這種情況下是「click」)。使用上述任一技術,您都可以覆蓋該行爲。 – Pointy 2013-04-04 00:35:48

1

聲明函數外部的var的imageString,並在GameCard和匿名click()事件的函數中使用它。

這兩個函數不會共享內存空間,因爲匿名函數不會在GameCard上下文中執行,但它們都共享在外部聲明的全局變量。

+0

如果採取這種路線,應該小心污染全局名稱空間,特別是如果您有多個GameCard對象實例。 – TheManWithNoName 2013-04-04 00:34:17

+0

我同意。只是試圖保持答案簡單。 – 2013-04-04 00:36:51

1

在這種情況下,「this」引用$(this.cardDiv)而不是父對象。

你可能會考慮具有包含您的CardGame對象的

這種方式以外的所有數據的JavaScript對象中的數據將作用域從你的方法