从范围外访问变量?

时间:2013-04-04 00:24:26

标签: javascript jquery scope

所以,我对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。这有道理,我将如何访问它?

提前致谢, Ĵ

3 个答案:

答案 0 :(得分:2)

两种方式:首先,您可以将this隐藏在另一个变量中:

var saveThis = this;

在设置“click”处理程序之前,然后在处理程序代码中使用“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

答案 1 :(得分:1)

在函数外部声明一个var的imageString,并在GameCard和匿名click()事件的函数中使用它。

这两个函数不共享内存空间,因为匿名函数不是在GameCard的上下文中执行的,但它们都共享在外面声明的全局变量。

答案 2 :(得分:1)

在这种情况下,“this”指的是$(this.cardDiv),而不是父对象。

您可以考虑使用包含CardGame对象之外的所有数据的javascript对象

这样,数据的范围可以更高,并可以从您的方法中访问