2012-03-22 58 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