2013-05-30 69 views
0

爲什麼在下面的代碼都是:爲什麼這些「this」和「that」變量都未定義?

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(); 
    } 
} 
+1

定義了「SITE.fadeTime」嗎?這不是你在這裏發佈的代碼。 – apsillers

+0

我只是打電話給SITE。初始化()來運行它,我有這個設置,以便我的所有變量和方法不會與其他人衝突。 –

回答

2

當您的「點擊」處理程序被調用時,this將引用涉及的DOM元素。由於DOM元素通常不具有「fadeTime」屬性,因此值爲undefined

您聲明的「that」缺少var關鍵字。因此這個變量是全局的。它指的是「SITE」對象,如果是「初始化」功能,在有可能的方式調用:

SITE.initialize(); 

然而,變量「fadeTime」是一個局部變量,而不是「SITE」對象的屬性。因此,將「fadeTime」作爲「SITE」對象的屬性提供給您undefined

在「初始化」功能,你可以這樣做:

var that = this; 

this.fadeTime = 100; 

然後提到「fadeTime」爲「是」的屬性會工作。

1

您可以調用fadeTime,因爲它在初始化函數的範圍內。 this.fadeTime或that.fadetime確實不存在,因爲您不在該範圍上分配變量。

作爲旁註,您的fadeTime變量看起來更像一個常量。在JS常見的是使用全部大寫的變量名定義常量:

var MY_CONSTANT = "some-value"; 
0

在你的代碼,thatSITE,即使是在事件處理函數。因此,that.fadeTime指的是SITE.fadeTime - 但SITE.fadeTime從未定義。

相反,你既可以做:

$('div#pageHome').fadeIn(fadeTime); 
在你的事件監聽器

,指你在initialize詞法範圍聲明的fadeTime變量,或者你可以在做

this.fadeTime = 100; 

initialize的頂部設置SITE.fadeTime(因此也設置that.fadeTime)。

0

當你用var標記變量時,它就是一個局部變量。當你想創建一個你可以訪問的實例變量時,你必須聲明變量

this.fadeTime = 100;

而不是

var fadeTime = 100;

相關問題