2014-12-23 140 views
0

我有這個簡單的Javascript代碼編寫一些模塊,但我不知道爲什麼我得到的,即使我從內調用該函數不確定的結果:爲什麼這個JavaScript類返回undefined

window.onload = function() { 
    function testFunction() { 
     this.hours = null; 
     function getHours() { 
      return this.hours; 
     } 

     alert(getHours()); 
     return { 
      getHours: function() { 
       return getHours(); 
      } 
     } 
    } 

    var test = new testFunction(); 
    alert(test.getHours()); 

} 

我認爲我在理解javascript中的THIS關鍵字方面存在問題,並在javascript構造函數中使用它。

謝謝。

+1

你的'getHours'函數中的'this'與它之外的'this'是不一樣的。 –

+0

@VsevolodGoloviznin有什麼不同?我真的想明白這一點!謝謝你的評論。 – Mohammad

+0

@Mohammad這很簡單 - 如果你調用'obj.myFunc()',那麼'this === obj'。但是如果你只是調用'myFunc()'然後調用'this === window''(或ES5嚴格模式中的'null'!) – Alnitak

回答

1

你(初始)問題是在這裏:

return { 
    getHours: function() { 
     return getHours(); 
    } 
} 

通過使「裸」調用getHours()這個功能裏面你失去任何this情況下,你有。

相反,這樣做:

return { 
    getHours: getHours 
} 

即返回包含所需要的功能的基準的對象。當您撥打test.getHours()時,它會正確地將test作爲this傳遞到getHours

的另一個問題是,因爲你使用return,露出了一組功能,即返回的對象變成了新建成的this不再是指您添加到hoursthis

這是兩個(或更多)JS OOP技術的不幸混雜,它們彼此衝突。

+0

Samething!未定義的結果! – Mohammad

+0

好的 - 還有其他的東西在播放 - 讓我檢查 – Alnitak

+0

對,你應該使用'var hours',而不是'this.hours'。 – Alnitak

1

那麼,想想「這」指的是什麼。第一個指向它所在的函數「testFunction()」。第二個指向它所在的函數,「getHours()」,但是你定義了getHours兩次,並且第二次返回的是未定義的,因爲你不再擁有「this」。默認情況下,當沒有你想要返回的東西時,javascript返回「undefined」。在我寫這篇文章時,我注意到另一個提出解決問題的答案,所以我不會在此重複。

相關問題