괴짜 프로그래머의 일상사~@@
프로그래밍, 컴퓨터, 그리고 일상에 관한 소소한 이야기들...
Blog | Guestbook
Keyword | Local | Tag
T 547 / Y 754 / Total 3471272
Catergories
Calendar
«   2023/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tag
영화, 빌더, 클립보드, 동양, 공간, 자만, MBSA, 영어, TSVN, 체스, 반야, , 쓰레드, 교보 문고, 귀차니즘, 펜팔, 바탕화면, 괴짜 경제학, mfc, 경품,
Archive
Link
Search
  submit
Recent Articles
Recent Comments
Recent Trackbacks
2008/12/12 18:01
흔히 하는 자바스크립트 클로저와 관련된 실수
[js]var funcs = new Array(2);

for(var i=0; i<funcs.length; ++i)
{
    funcs[i] = function() { alert(i); }
}

funcs[0]();[/js]
간단한 자바 스크립트 코드입니다.
뭐가 출력될까요? 3이 출력됩니다.

고쳐봅시다.

[js]var funcs = new Array(2);

for(var i=0; i<funcs.length; ++i)
{
    funcs[i] = function() { return function() { alert(i); } };
    funcs[i] = funcs[i]();
}

funcs[0]();[/js]
의미가 좀 불명확하죠.
아래와 같이 고치면 확실히 무슨 일을 하는 코드인지 눈에 들어옵니다.

[js]var funcs = new Array(2);

function GenerateFunction(i)
{
    return function() { alert(i); }
}

for(var i=0; i<funcs.length; ++i)
{
    funcs[i] = GenerateFunction(i);
}

funcs[0]();[/js]
설명해 봅시다.
클로저에 관한 건데요. 첫 번째 샘플은 for문이 마치 클로저같은 역할을 하는 것처럼 보이지만 아닙니다. 자바스크립트 클로저는 항상 함수랑 관계가 있기 때문입니다. 즉, 저기는 클로저가 없습니다. 그러니 i가 저장된 런타임 정보는 글로벌 밖에 엄죠. 그러니 마지막 값인 3이 출력되는 겁니다.

마지막 예제를 살펴봅시다. GenerateFunction안에서 리턴되는 함수에서는 GenerateFunction 함수 안의 값인 i를 참조하고 있습니다. 즉, 클로저가 생긴거죠. 그래서 리턴된 함수가 계속 살아 있는 동안 해당 컨텍스트 정보도 파괴되지 않고 같이 살아 있습니다. 그래서 0이 출력되는 겁니다.

Trackback : http://jiniya.net/tt/trackback/748
minis24 (2009/11/09 14:29)
안녕하세요..약간의 오류가 있어서 남깁니다.
제일 처음의 소스에서는 2가 출력이 됩니다. 배열의 길이가 2죠~~~~
i가 2가 되었을때 false 가 되어 루프를 벗어나게 됩니다.

클로저는 가비지컬렉션(gc)의 작동방식을 이용한 방법인데요..자바스크립트 클래스에서 프라이빗 변수를 선언할때 유용합니다.

자바스크립트에서 gc는 아무런 참조가 없는 객체를 메모리에서 삭제하지요...하지만 클로저를 사용하여
참조를 리턴하게 되면 함수가 실행이 끝난뒤에도 참조가 살아 있기 때문에 객체가 메모리에서 삭제되지 않고 사용할 수 있게 되는것입니다..

lashes near me (2020/09/09 18:17)
tthanks for shairng this

lashes near me (2020/09/09 18:17)
tthanks for shairng this

sandblasting orlando fl (2021/11/29 22:40)
Awesome! Learned alot thanks so much keep posting more.

Name   Password   Home   Secret   Submit
 Prev   1  ...  32   33   34   35   36   37   38   39   40  ...  604   Next 
codewiz’s Blog is powered by Tattertools.com / Designed by faido