2015-01-24 1 views
1

이 간단한 자바 스크립트 폐쇄 작업을하는 방법 :이 같은 친구에게 자바 스크립트 폐쇄을 설명했다

function outer() { 
    var count = 0; 
    return (function(){ 
     count++; 
     console.log(count); 
    })(); 
} 

내가 외부 함수가있을 때이 '계산'않는 방법 변수가 저장되는 것을 그에게 보여 주려했다 실행.

그래서 나는 자바 스크립트 콘솔에서이 일을 시도하고 콘솔에서이 작업을 수행 할 때 내가 무슨 이해하지

outer(); // prints out 1 
outer(); // calling again prints 2 
outer(); // prints out 3 

하지만 실제로이

outer(); // printed 1 
outer(); // printed 1 again 
outer(); // again 1 

일어난 것을 그에게 보여주고 싶었다 여기 잘못왔다. 누군가 나를 인도 할 수 있습니까?

+2

에 저장합니다. 'var myouter = outer(); myouter(); myouter(); myouter()' – elclanrs

+0

처음으로 작동하는 @elclanrs. 그러나 그것을 다시'myouter();로 호출하면 "TypeError : undefined가 함수가 아닙니다" –

+2

'outer'가 함수를 반환하지 않고'undefined'를 반환합니다. 함수를 반환하지만 실행하지 않으면 제대로 작동합니다. – elclanrs

답변

2

감사합니다 elclanrs. 이것은 작동 코드입니다.

function outer() { 
    var count = 0; 
    return (function(){ 
    count++; 
    console.log(count); 
    }); 
} 

지금 내가이 함수를 호출하고 당신은 아마 함수를 반환하는 의미 변수

var myouter = outer(); 
myouter(); 
// 1 
// undefined 
myouter(); 
// 2 
// undefined 
myouter(); 
// 3 
// undefined 
1

당신의 count가 함수 내에서 선언하기 때문이다, 그래서 그래서 당신의 기능, 변수 count가 다음 0 내면의 함수로 생성 및 초기화됩니다 호출 될 때마다, 일명, 기능의 범위를 "개인"입니다 닫는 값이 증가하므로 결과적으로 1이 출력됩니다. 그런 다음 닫음이 반환 될 때 count 변수가 가비지 수집됩니다. 일치하는 중괄호 안에 count을 함수 외부의 가장 바깥쪽으로 이동 한 다음 당신이 원하는 것을 얻을 수 있다면, count은 전역 풀을 오염시키지 않고 메모리 누수 문제를 일으키기 때문에 프로덕션 코드에서 좋지 않은 전역 변수가됩니다. 클로저는 기본적으로 Java와 같은 내부 기능입니다.

+0

내가하고 싶은 것은 '카운트'를 내부 함수에 비공개로하고 여전히 이런 식으로 예제를 보여 주기만하면된다. 그렇게 할 수있는 방법이 있습니까? 나는 클로저가 변수를 자신에게 비공개로 유지하는 데 어떻게 사용되는지 보여주고 싶었습니다. 따라서 귀하의 답변은이 경우 적용되지 않습니다. –

+0

당신은 함수에서 함수를 감싸서 private 변수를 만들 수 있습니다.하지만 원하는 것을 얻기 위해서 - 함수를 3 번 ​​호출하고 count가 3이 될 것으로 예상하면, 'count'가 함수를 사용하지만'setTimeout()'을 사용하여 원하는 것을 얻을 수있다. – Dummy

1

outer()에 전화 할 때마다 count=0을 설정합니다. 전역 범위를 벗어난 의미 개인으로 count를 원한다면, 나는이 같은 모듈 패턴을 사용합니다 :

var counter = (function(c){ 
    var count = 0; 

    c.outer = function(){ 
     count++; 
     console.log(count); 
    }; 
    return c; 
}({} || counter)) 

counter.outer(); 

또는 당신은 단순히 outer() 반환에게 기능을 할 수 있습니다 : @에

function outer() { 
    var count = 0; 
    return function(){ 
     count++; 
     console.log(count); 
    }; 
} 

var myo = outer(); 
myo(); 
myo(); 
myo();