2012-03-22 61 views
1

我這樣做爲什麼這個內部函數返回undefined?

function myFunction() { 
    var myVar = "I think I am encapsulated"; 

    function getMyVar() { 
     return myVar; 
    } 
} 

var myProperty = myFunction; 
myProperty.getMyVar(); // tells me myProperty.getMyVar is not a function. 

function myFunction() { 
    var myVar = "I think I am encapsulated"; 

    function getMyVar() { 
     return myVar; 
    } 
} 

var myProperty = myFunction(); 
myProperty.getMyVar(); // tells me myProperty is undefined 

甚至

function MyFunction() { 
    var myVar = "I think I am encapsulated"; 

    function getMyVar() { 
     return myVar; 
    } 
} 

var myProperty = new MyFunction(); 
myProperty.getMyVar(); // tells me myProperty.getMyVar is not a function. 

,並在所有三種情況下,我得到的問題。我在所有三節中都將這個問題列入了行評註中。現在,在有人告訴我只使用閉包之前,我並不想理解閉包,我正在試圖理解內層函數會發生什麼。

如果您可以在上面解釋,我將不勝感激。因爲它對我來說不直觀。

謝謝

+5

內部函數不是封閉函數的*屬性*。 – 2012-03-22 20:04:57

回答

2

您不公開getMyVar函數。

你想:

function myFunction() { 
    var myVar = "I think I am encapsulated"; 

    this.getMyVar = function() { 
     return myVar; 
    } 
} 

然而,myVar的也是局部範圍的功能執行...和功能可按尚未執行。

最後幾行必須

(new myFunction()).getMyVar(); 

編輯:雖然也許你正在尋找的是僞命名空間?在這種情況下,你可以這樣做:

var myObject = { 
    myProperty: "value", 
    myFunction: function() { } 
} 

或者,更有可能你想使myVar的行爲像一個私有成員,在這種情況下,你可以這樣做:

var myObject = function() { 
    var myVar = "I think I am encapsulated"; 

    return { 
     getMyVar: function() { 
      return myVar; 
     } 
    } 
}(); //self-executing function 
+0

謝謝。我還有一個關於封裝的問題。可能需要一個單獨的線程。 – dublintech 2012-03-22 20:13:42

5

做過什麼,只是定義一個函數裏面myFunction,創造一個封閉...

爲了彌補的實施,使getMyVar實例成員

function myFunction() { 
    var myVar = "I think I am encapsulated"; 

    this.getMyVar = function() { 
     return myVar; 
    } 
} 
+0

謝謝。請原諒我的教誨,但這也會產生封閉性,因爲它也在myFunction中定義了一個函數 - 儘管它是一個匿名函數。 – dublintech 2012-03-22 20:21:43

+0

我沒有說這不是... – xandercoded 2012-03-22 20:23:11