2013-04-04 155 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对象中的数据将作用域从你的方法