'공부'에 해당되는 글 2건

  1. 2010.07.11 자바스크립트(1-1) - 클로저(closure) 에 대한 이해. (5)
  2. 2008.12.01 두가지 일. (2)

클로저는 실무에서 자바스크립트로 개발을 하다보면 자신도 모르게 사용했던 개념이다. 클로저는 몰라도 예제코드를 보면 "아하, 그게 클로저야?" 라고 되묻는 사람들이 꽤 많을 것이다.

아래 코드를 보자.

var closureTest = function() {
	var closureVar = "closure test";

	return function() {
		alert(closureVar);
	}
}

closureTest 라는 함수는 closure test 라는 문자열을 출력하는 익명함수를 리턴한다. 그리고 위 코드를 수행하면 정상적으로 closure test 메시지가 alert창으로 뜬다.

위 코드가 왜 이상한지 모르겠는 사람은 클로저에 대한 이해가 충분하거나, 아니면 자바스크립트에 대한 이해가 불충분한 사람일 것이다.

기본적으로 closureVar 변수는 closureTest 에 속한 지역변수 이기 때문에 다른 외부함수에서 호출하는 것이 불가능하다. 변수를 호출하기 위한 방법으로는 지역변수로 선언된 closureVar 변수를 전역변수로 바꿔 선언하는 방법이 있다. 

그런데 자바스크립트에서는 굳이 이렇게 하지 않아도, 함수에 속한 지역변수를 다른 함수가 호출하게 하는 것이 가능하다. 이게 바로 클로저다. 좀 더 정확하게 이야기 하면, 클로저란 자신이 생성된 함수의 context에 직접 접근(참조) 할 수 있는 것이다.

위 코드를 좀 더 쉽게 풀어보면 아래와 같다.

var closureTest = function() {
	var closureVar = "closure test";

	return closureTest2();
}

var closureTest2 = function() {
	alert(closureVar);
}

하지만 위 코드는 제대로 동작을 하지 않는다. closureVar 변수가 closureTest 함수에 선언되었기 때문에, closureTest2 함수에서 접근할 수 없기 때문이다. 

위 코드를 동작시키기 위해선 closureVar 변수를 전역변수로 새로 선언해야 한다.

var closureVar = "";
var closureTest = function() {
	closureVar = "closure test";

	return closureTest2();
}

var closureTest2 = function() {
	alert(closureVar);
}
하지만 변수가 많아진다면 이 모든 변수를 전역변수로 할당해야 하는데, 코드도 어려워지고(지저분해지고) 개발자도 힘이 든다. 변수를 모두 전역변수로 선언하지 말고, 클로저를 잘 이해하여 써먹어보자.


신고
Posted by onionmen

댓글을 달아 주세요

  1. Favicon of http://coolmoo.net BlogIcon 나비오 2010.07.21 23:24 신고  댓글주소  수정/삭제  댓글쓰기

    이해하고 싶지만 당췌 봐도 모르겠다는...
    제가 정말로 무식하죠ㅜㅜ
    저도 오늘 자바 책 하나 사긴 했는데 걱정이 앞서네요

  2. Favicon of http://pam.ncity.net/wp BlogIcon pam 2010.10.24 12:42 신고  댓글주소  수정/삭제  댓글쓰기

    큰 깨닫음 얻고 갑니다. 크..

  3. 지나가던이 2010.12.02 11:21 신고  댓글주소  수정/삭제  댓글쓰기

    "함수에 속한 지역변수를 다른 함수가 호출하게 하는 것이 가능하다. 이게 바로 클로저다."
    라는 설명은 그냥 내부함수에서 외부함수의 변수를 접근할수 있다. 즉 scope, 유효범위에 대한것 같네요 ^^;
    "클로져는 자신의 외부에 선언된 변수를 참조가 아닌, 복사본으로 가지는 함수"라고 봄이 맞지않나 싶네요
    http://asrada2001.tistory.com/201 여기를 참고하시면 더 이해가 빠를듯합니다

  4. 느네 2011.04.24 10:32 신고  댓글주소  수정/삭제  댓글쓰기

    좋은정보 얻고 갑니다~
    출처 밝히고 내용좀 퍼갈께요 ㅎㅎ

2008.12.01 22:32 Deep

두가지 일.

1. 오랜만에 앨범을 구입했다. 싸구려커피가 들어있는 보온병같은 앨범이다. 듣고있다보면 정신이 멍해지는 노래 세곡이 수제케이스에 고이 들어있다.

커피를 좋아하지 않아서, 아니 마시지 않아서 미지근한 커피를 마시고 속이 쓰리는건 알 수 없으나 비닐장판에 발바닥이 쩍 달라 붙었다 떨어지는 느낌은 있어서 좋다.

그래서 샀다. 천원짜리 네장으로 얻을 수 있는 즐거움.




2. 공부가 하고싶어졌다.
어제, 그러니까 11월의 마지막 날이면서 마지막 일요일이었던 날, 왕복 100분 거리의 결혼식장에 다녀왔음에도 불구하고 컴퓨터 앞에 앉아 블로깅을 했다.
싱숭생숭한 마음에 마음이 안정되지 않았는데, 애인없는 솔로가 봄바람 살랑 맞으며 하염없이 핸드폰 전화번호부를 뒤지고 다니는 그런 마음과는 조금 달랐다. 아주 오랜만에 느껴보는. 아니 어쩌면 거의 처음이라고 해도 좋을 그런 느낌은 바로 지적갈망이었다.

그래서 오늘은 서점에 들렀다.

내일까지 싱숭생숭하면 공부를 시작해야겠다.



0. 불과 몇 년 전에는 할 수 없었던 일을, 지금은 할 수 있을 것 같다는 생각이 들었다.
사람은 이래서 도전이란걸 하나보다.

고등학교때 우리 담임은 도전하는 사람에게 우리는 희망을 갖습니다. 라는 긴 문장을, 안그래도 외울것 많은 고등학생들에게 외우라 시켰다. 1592년에 조선에 무슨 일이 일어났는지는 까먹어도 이건 안까먹는거 보면 우리 담임은 성공한거다.
신고

'Deep' 카테고리의 다른 글

추운 2010년을 보내고, 2011년을 맞이하며  (0) 2010.12.13
당신의 물김치는 너무 맛있다.  (2) 2010.07.25
두가지 일.  (2) 2008.12.01
생일축하한다. 내 동거인이었던 사람.  (3) 2008.07.17
경계심과의 충분한 협상  (8) 2007.12.07
어떤 하루  (0) 2007.10.13
Posted by onionmen

댓글을 달아 주세요

  1. Favicon of http://echoya.com/ BlogIcon 에코 2008.12.02 00:11 신고  댓글주소  수정/삭제  댓글쓰기

    내일까지 싱숭생숭한지 봐봅시다 ㅋ

이전버튼 1 이전버튼

블로그 이미지
손을 따뜻하게 만들어 주고 싶은 애인이 있습니다.
onionmen

달력

 « |  » 2017.12
          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
31            
DNS Powered by DNSEver.com

최근에 올라온 글

Yesterday117
Today101
Total1,624,890

티스토리 툴바