0

为什么在下面的代码中都是:

this.fadeTime
that.fadeTime

未定义,在 Javascript 类中保存这样的内部变量的最佳方法是什么?

var SITE = SITE || {};
SITE.initialize = function() {

    var fadeTime = 100;
    that = this;

    $('li#linkHome').click(function() {
        resetPageLinks();
        $('li#linkHome').addClass('active');
        resetPages();
        console.log(this.fadeTime); //undefined
        console.log(that.fadeTime); //undefined
        $('div#pageHome').fadeIn(that.fadeTime);
    });
    $('li#linkInfo').click(function() {
        resetPageLinks();
        $('li#linkInfo').addClass('active');
        resetPages();
        $('div#pageInfo').fadeIn(that.fadeTime);
    });
    $('li#linkAbout').click(function() {
        resetPageLinks();
        $('li#linkAbout').addClass('active');
        resetPages();
        $('div#pageAbout').fadeIn(that.fadeTime);
    });

    function resetPageLinks() {
        $('ul.nav li').removeClass('active');
    }

    function resetPages() {
        $('div.sitePage').hide();
    }
}
4

4 回答 4

2

当您的“点击”处理程序被调用时,this将引用所涉及的 DOM 元素。因为 DOM 元素通常没有“fadeTime”属性,所以值为undefined.

您对“那个”的声明缺少var关键字。因此,该变量是全局的。如果以可能的方式调用“initialize”函数,则它指的是“SITE”对象:

SITE.initialize();

但是,变量“fadeTime”是一个局部变量,而不是“SITE”对象的属性。因此,将“fadeTime”称为“SITE”对象的一个​​属性也可以为您提供undefined.

在“初始化”函数中,您可以这样做:

var that = this;

this.fadeTime = 100;

然后将“fadeTime”作为“that”的属性引用将起作用。

于 2013-05-30T14:41:57.377 回答
1

您可以只调用fadeTime,因为它在您的初始化函数范围内。this.fadeTime 或 that.fadetime 确实不存在,因为您没有在 this 范围内分配变量。

作为旁注,您的 fadeTime 变量似乎更像一个常数。在 JS 中,通常使用所有大写变量名来定义一个常量:

var MY_CONSTANT = "some-value";
于 2013-05-30T14:41:59.607 回答
0

在您的代码中,即使在事件处理程序函数中,也that指的是。SITE因此,that.fadeTime指的是SITE.fadeTime——但从SITE.fadeTime未定义过。

相反,您可以这样做:

$('div#pageHome').fadeIn(fadeTime);

在您的事件侦听器中,引用fadeTime您在 的词法范围内声明的变量initialize,或者您可以这样做

this.fadeTime = 100;

initializeto set的顶部SITE.fadeTime(因此也设置that.fadeTime)。

于 2013-05-30T14:45:12.117 回答
0

当你用 var 标记变量时,它是一个局部变量。当您想创建一个可以使用它访问的实例变量时,您必须使用

this.fadeTime = 100;

代替

变种淡化时间 = 100;

于 2013-05-30T14:45:33.427 回答