2012-03-22 5 views
1

내가 할이이 내부 함수가 정의되지 않은 이유는 무엇입니까?

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

내부 기능은 내부 기능의 * 속성 *이 아닙니다. –

답변

2

당신은 getMyVar 기능을 노출하지 않습니다.

당신이 원하는 :

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

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

그러나, myVar에 또한 로컬 기능 실행에 범위가 ... 그리고 funciton이 실행되지 않았습니다.

마지막 라인은

(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

5

은 그냥 ,

구현을 해결하기 위해 ... 클로저를 만들어 myFunction 내부 함수를 정의 할 getMyVar인스턴스 멤버 :

+0

감사합니다. My pedantry를 미안하지만 myFunction 내부의 함수를 정의하고 있기 때문에 closure를 만들 수도 있습니다. 익명 임에도 불구하고 말입니다. – dublintech

+0

나는 그게 아니라고 말하지 않았다 ... – xandercoded

관련 문제