2014-11-07 2 views
1

Javascript 모듈 패턴을 구현하고 있는데 어떻게 사용하는지 잘 알고 있습니다. 필자가 이해할 수없는 것은 일단 함수가 실행되고 반환 값이 할당되면 개인 변수 및 메서드에 어떤 일이 발생하는지 개념입니다. 내가 파일을 실행하면Javascript 모듈 패턴, 개인 변수는 어디에 있습니까?

var myModule = (function() { 

var privateVar1, privateVar2 = 10, privateLogger, privateHello; 

privateLogger = function(someInput) { 
    console.log(someInput); 
}; 
privateHello = function() { console.log('Hello World!');} 

    return { 
    publicVar: 'myName', 
    publicCounter: 0, 
    publicIncrementor: function(bar) { 
     bar++; 
     privateLogger(bar); 
     privateHello(); 
    } 
    } 
})(); 
console.log(myModule); 
console.log(myModule.publicIncrementor.toString()); 

, 나는 다음의 출력을 얻을 : 내가 지금과 같은 모듈이있는 경우

이에서

{ publicVar: 'myName', 
    publicCounter: 0, 
    publicIncrementor: [Function] } 
function (bar) { 
    bar++; 
    privateLogger(bar); 
    privateHello(); 
} 

을 인 MyModule 이제 변수처럼 보인다 publicVar, publicCounter 및 publicIncrementor가 무엇인지 알 수 있습니다. 그래서 privateHello가 무엇인지 어떻게 알 수 있습니까? 인스턴스화 후에 함수 정의는 어디에 있습니까? 그것은 myModule의 일부가 아닙니다 (console.log (myModule)에는 표시되지 않습니다). 그것은 세계적인 기능이 아닙니다 (이 패턴의 핵심을 피하는 것). 그렇다면이 함수 정의는 현재 어디에서 살고 있습니까?

또는 privateHello 함수가 myModule.publicIncrementor를 호출 할 때마다 다시 정의되는 것입니까?

답변

1

이 어디 폐쇄에 팝. privateHello, privateLogger, privateVar1privateVar2이 즉시 호출 기능 범위, 그리고 당신의 publicIncrementor 기능을합니다 (publicIncrementor 범위를 벗어난다)이 private 변수에 액세스하고, 폐쇄 만들어집니다.

귀하의 질문에 대답하기 위해 : 그것은 지금 폐쇄에 살고 있습니다. 귀하의 질문에 대해 매번 재정의 경우, 나는 100 % 확신 아니에요하지만 내가 아는 한 클로저는 로컬 범위 밖에서 변수에 액세스 할 때마다 다시 만들어 지지만 객체를 다시 정의하지는 않습니다. 그 대신 항상 동일한 대상을 가리킬 것입니다.

이 클로저를 다루 재미있는 답변이 많이 있습니다, 그래서 당신은 다음과 같은 답변을 한 번 봐 걸릴 수도 있습니다 : 원래 코드에서 How do JavaScript closures work?

+0

감사합니다. 어떤면에서 내가 필요한 것은 무슨 일이 일어 났는지 설명하는 용어였습니다. 따라서 연구를 끝내라는 사실을 알려주는 것은 큰 도움이됩니다. –

+0

또한이 문제를 살펴볼 때이 연습의 IIFE 부분을 무시하고있었습니다.이 부분은 범위 질문과 같은 큰 부분입니다. –

+0

이 링크는 매우 유용했습니다 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures –

1

(질문이 업데이트되기 전에)을 privateHello가 실종되었다 변수 선언 목록은 privateHello이 실제로 글로벌이되었습니다.

var 목록에 추가 했으므로 현재 모듈 생성자 함수의 범위에있는 로컬 변수입니다.

지금 귀하의 질문에 답변 해 드리겠습니다.

여기에서 myModule은 이제 publicVar, publicCounter 및 publicIncrementor가 무엇인지 알 수있는 변수로 보입니다. 그래서 privateHello가 무엇인지 어떻게 알 수 있습니까?

myModule 인스턴스는 어떻게 든 privateHellomyModule를 데 "다가"할 수있는 의미에서 직접 privateHello을 "알고"하지 않습니다.

그러나 myModule을 생성하는 데 사용되는 생성자 함수는 privateHello을 본문의 로컬 변수에 선언합니다.

여기서 인스턴스화 후에 함수 정의가 존재합니까?

어딘가에 있습니다.

이는 myModule의 일부가 아닙니다. console.log (myModule)에는 표시되지 않습니다.

입니다. myModule의 속성에 할당되지 않았습니다.

글로벌 기능이 아닙니다 (이 패턴의 핵심을 피하는 것).

이제 이전 버전의 질문에서 그렇습니다.

그렇다면이 기능 정의는 현재 어디에서 살고 있습니까?

실제로는 컴퓨터 메모리의 어딘가에 있습니다. 논리적으로 이것은 모듈 생성자 함수의 지역 변수 일뿐입니다. privateVar1은 어디에 있습니까? 그들은 아마도 privateHello 인 이웃입니다.

또는 myModule.publicIncrementor을 호출 할 때마다 privateHello 함수가 재정의됩니까?

"재 정의 된"의 의미를 알지 못해도 대답하기가 어렵습니다. 아마도 함수의 모든 "인스턴스"가 될 것입니다. 그러나 이것이 구현 세부 사항이라고 생각합니다. 지역적으로 정의 된 함수의 새로운 표본을 얻는 것에 대해 걱정하고 있습니까? 하지마.

+0

그래, 나는 그것을 바꾸기 위해 질문을 편집했다. 노드에서 일부 검사를 실행할 때 전역 객체를 로깅하고 privateHello 함수를 보았지만 privateIncrementor가 아닌 혼란 스러웠습니다. 그러나 그 때 나는 그것이 빠진 var 때문에 그것이다는 것을 깨달았다. 내가 봤던 이유를 알았 기 때문에 편집했는데 내가 묻고있는 질문이 아니 었습니다. –

+0

myModule의 생성자 함수 텍스트를 기록하고 검사 할 수있는 방법을 알려주시겠습니까? 내가 그렇게 할 수 있다면, 그 결과로 privateHello가 보이겠습니까? –

+0

@RV 'myModule' 인스턴스가 있습니까? 나는 네가 할 수 없다고 생각해. 만약 당신의 질문을 올바르게 받았다면 "주어진 객체 인스턴스를 반환 한 함수를 어떻게 얻을 수 있습니까?" 그래서 이것이 당신이 묻는 것이라면 나는 당신이 그렇게 할 수 없다고 생각합니다. 아마도 그렇게 할 수있는 트릭이 있지만, 내가 아는 것과 사용하지 않는 것은 없습니다. – lexicore

관련 문제