2014-06-14 2 views
0

자바 스크립트의 모듈 패턴을 배우고 있습니다. 아래는 "바구니"모듈의 예입니다.JS 모듈 패턴 - 개인 변수가 삭제되지 않는 이유

나는이 함수가 실행되는 익명의 함수라는 것을 알고 있기 때문에, 그 변수 안에있는 변수에 액세스 할 수 없다는 것을 알 수 있다고 생각한다. 익명 함수의 실행이 끝난 후에이 함수 내의 변수와 함수가 삭제되거나 가비지 수집되지 않는 이유는 무엇입니까? JS는 나중에 사용할 수 있도록 메모리에 보관하는 것을 어떻게 알습니까? 우리가 그들을 액세스 할 수있는 함수를 반환했기 때문입니까?

var basketModule = (function() { 

    // privates 

    var basket = []; 

    function doSomethingPrivate() { 
    //... 
    } 

    function doSomethingElsePrivate() { 
    //... 
    } 

    // Return an object exposed to the public 
    return { 

    // Add items to our basket 
    addItem: function(values) { 
     basket.push(values); 
    }, 

    // Get the count of items in the basket 
    getItemCount: function() { 
     return basket.length; 
    }, 

    // Public alias to a private function 
    doSomething: doSomethingPrivate, 

    // Get the total value of items in the basket 
    getTotal: function() { 

     var q = this.getItemCount(), 
      p = 0; 

     while (q--) { 
     p += basket[q].price; 
     } 

     return p; 
    } 
    }; 
})(); 
+0

http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Jack

답변

1

개체에 대한 참조가있는 한 가비지 수집되지 않습니다.

위의 코드는 JavaScript를 사용하여 내부 함수 내부에 외부 값을 효과적으로 트래핑하는 Closure를 만듭니다.

var test = (function() { 
    var k = {}; 

    return function() { 
    // This `k` is trapped -- closed over -- from the outside function and will 
    // survive until we get rid of the function holding it. 
    alert(typeof k); 
    } 
}()); 

test(); 
test = null; 
// K is now freed to garbage collect, but no way to reach it to prove that it did. 

더 긴 토론이 여기에 있습니다 : :
How do JavaScript closures work?

0

당신은 폐쇄 범위를 참조 여기에

짧은 폐쇄 예이다. 클로저 범위는 범위를 만든 외부 함수가을 반환 한 후에도 내부 함수가 액세스 할 수있는 범위입니다 ( )!

그래서, 그래, 당신은 외부 '개인' 기능은 메모리에 더 이상에 액세스 할 수 없습니다 까지 내부 범위를 쓰레기 수집되지 않습니다, 정확합니다.

관련 문제