2012-02-02 1 views
2

시작하기 전에 ECMA 스크립트 사양이 아마도 내 질문에 대답 할 것이라는 것을 알고 있습니다. 그러나 나는 이해할 수있는 대답을 얻기 위해 그것을 요구하고 있습니다. 이 코드를 실행하면Javascript의 익명 함수가 외부 함수의 변수에 액세스 할 수있는 이유를 설명하십시오.

function test1(param) { 
    alert(param); 
} 

function test2() { 
    var testvar = 99; 
    setTimeout(function(){ test1(testvar); }, 1000); 
} 

test2(); 

, 나는 99 내 질문은, test2에, test2 완료가 실행 한 후 null이 될 수 없습니다 testvar해야한다 보여주는 팝업 상자를 얻을 :

다음 코드를 가지고? setTimeout의 익명 함수는 testvar 값을 어떻게 얻습니까? setTimeout이 호출 될 때 스택 복사가 진행 중입니까?

+0

힌트 : Google "폐쇄". – cHao

+0

보드카 한 병을 들고이 질문을 읽으십시오. 나는 당신에게 대답을하려고 노력할 것이지만 나의 사무실에는 알코올 정책이 없다. http://stackoverflow.com/questions/500431/javascript-variable-scope – aehiilrs

+0

굉장합니다. 도와 주셔서 감사합니다. – quuxbazer

답변

3

이 결과는 closures입니다. 자바 스크립트의 함수는 어휘 범위에서 정의 된 변수를 "close over"로 유지합니다. 즉, setTimeout에 주어진 함수가 생성 될 때 참조 할 수있는 모든 변수는 test2이 반환 된 후에도 오랫동안 참조 될 수 있습니다.

이렇게하면 클로저는 함수가 만들어 질 때 범위에 있던 변수에 대한 바인딩과 함수가됩니다. 이것이 종결자를 poor man's objects (및 의 반대로)이라고 부르는 이유입니다.

+1

감사합니다. 나는 실제로이 이름이 있다는 것을 몰랐다. 당신은 컴퓨터 과학 학부로서의 4 년 동안 적어도 이것을 언급했을 것이라고 생각할 것입니다. – quuxbazer

0

이 기능을 closures이라고합니다. 기본적으로 옳은 일입니다. 익명의 함수에서 필요한 경우 주변 범위의 변수가 저장됩니다.

1

이것은 Javascript Closures으로 인해 발생합니다. 기본적으로 정의 된 시점에 함수에서 사용할 수있는 변수는 호출 된 위치에 관계없이 항상 사용할 수 있습니다.

관련 문제