2011-10-05 4 views
2

는 [Fiddle]Javascript - 메소드 변수가 콜백 내에서 생존하는 이유는 무엇입니까?

function TestMethod() { 
    var lifespan = "blah"; 

    $.ajax({ 
     url: "http://www.google.com", 
     success: function (data) { 
      alert(lifespan); 
     }, 
     error: function (errorData) { 
      alert(lifespan); 
     }, 
     dataType: 'html' 
    }); 
} 

이 왜 lifespan 여전히 때 콜백 화재 존재한다는 것입니다 말해봐? 비동기 호출을 통해 계속 유지되는 것은 무엇입니까? 어떤 일이 일어나는 것을 허용하고, 거기에 일종의 "런타임"이 있습니다. 자바 스크립트에서 프로세스 중에 코드가 생기게합니다. 그렇다면, 언제 메모리 아이템을 죽게 할 지 언제 알 수 있습니까?

+1

클로저에 캡처됩니다. 참조 : http://www.javascriptkit.com/javatutors/closures.shtml – asawyer

답변

4

당신은 자바 스크립트 클로저를 약 읽을 필요 -

다음은 jsFiddle의 예입니다. 임베디드 함수의 범위 내의 모든 변수 (부모 함수에서 선언되었는지 여부에 관계없이)는 함수 내부의 클로저에 대한 모든 참조가 실행될 때까지 사용 가능합니다.

저는 원래 C/C++ 개발자 였기 때문에 스택 프레임에 대한 가비지 수집과 같이 생각합니다. 함수의 스택 프레임은 함수의 실행이 끝나면 처리되지 않고, 모든 참조가 해제 될 때 처리됩니다. 아직 완료되지 않은 임베디드/내부 함수 (예 : 아약스 콜백)는 포함하는 스택 프레임에 대한 참조를 보유하므로 포함 함수가 실행을 완료 했더라도 임베디드 함수 자체가 완료 될 때까지 계속 사용할 수 있습니다.

일단 이해하면 매우 유용하고 C/C++ 같은 다른 언어에는없는 유용한 기능입니다. 더 많은 상황에서 로컬 변수를 유용하게 만듭니다.

+0

+1 나는 아직도 js 놈의 비트이지만, 나는 "자바 스크립트 좋은 부분"을 주문했다. –

5

자바 스크립트에는 C, C++, C#, PHP 및 Java와 같은 블록 범위 (중괄호)가 아닌 함수 범위가 있습니다.

http://jsfiddle.net/Wrz6X/

+0

+1 이것은 피들 (Fiddle)에게 큰 도움이됩니다. 앞으로 해당 사이트를 사용하는 것을 기억해야합니다. –

+0

저는이 답변에 많은 찬반 투표를하고 있습니다. 왜? 공동체가 이유가 "기능 범위"라고 말하고 폐쇄가 아니라고 말하고 있습니까? –

3

이것은 자바 스크립트의 기본 요소 중 하나입니다. 클로저 (람다 함수)는 정의 된 범위에서 변수를 상속받습니다.

그리고 비동기식 이벤트 기반 언어와 함께 제공되는 많은 문제를 극복하는 데 도움이됩니다.

function foo() { 
    var privateMsg = 'blah...'; 

    setTimeout(function(){ 
     alert('private msg: ' + privateMsg); 
    }, 5000); 
} 
관련 문제