- Arawn's Dev Blog
- Outsider's Dev Story
- Toby's Epril
- Benelog
- NHN 개발자 블로그
- SK 플래닛 기술 블로그
- OLC CENTER
- 소프트웨어 경영/공학 블로그
- 모바일 컨버전스
- KOSR - Korea Operating System …
- 넥스트리 블로그
- 리버스코어 ReverseCore
- SLiPP
- 개발자를 위하여... (Nextree 임병인 수석)
- "트위터 부트스트랩: 디자이너도 놀라워할 매끈하고 직관…
- Learning English - The English…
- real-english.com
- 'DataScience/Deep Learning' 카테…
- Deep Learning Summer School, M…
- Deep Learning Courses
민서네집
클로져(Closure)를 이용한 체인 깨기 본문
[참조] 실시간 웹 애플리케이션 개발을 위한 Node.js 프로그래밍 - 류성태 지음 (프리렉 출판사)
44~48 page
<!DOCTYPE html>
<script type="text/javascript">
function f() {
var b = "b";
return function() {
return b;
}
}
var n = f();
alert( n() ); // b
</script>
<!DOCTYPE html>
<script type="text/javascript">
function f() {
var b = "b";
this.getB = function() {
return b;
};
}
var n = new f();
alert( n.b ); // undefined
alert( n.getB() ); // b
</script>
<!DOCTYPE html> <script type="text/javascript"> function f(arg) { var n = function() { return arg; } arg++; return n; } var m = f(123); alert( m() ); // 124 </script>
<!DOCTYPE html>
<script type="text/javascript">
function f(){
var a=[];
var i;
for(i=0; i<3; i++){
a[i] = function(){
return i;
}
}
return a;
}
var b = f();
alert( b[0]() ); // 3
alert( b[1]() ); // 3
alert( b[2]() ); // 3
</script>
0, 1, 2 가 차례로 alert 되는 결과를 예상할 수 있지만, 실제는 그렇지 않다.
a[i] = function() { return i;}
는 함수 선언만 된 것이고 실제로 이 함수가 실행되는 것은 alert( b[0]() ); 명령을 만났을 때인데,
var b = f(); 문장에서 for loop문의 실행이 끝나고 i 값이 이미 3 으로 되어 있기 때문에 3 이 alert 되는 것이다.
<!DOCTYPE html>
<script type="text/javascript">
function f(){
var a=[];
var i;
for(i=0; i<3; i++){
a[i] = (function(x) {
return function(){
return x;
}
})(i);
}
return a;
}
var b = f();
alert( b[0]() ); // 0
alert( b[1]() ); // 1
alert( b[2]() ); // 2
</script>
function 내부의 변수인 i를 바로 return 하지 않고, 파라미터를 받는 function을 정의한 다음에
파라미터로 내부 변수 i를 넘겨서 클로저가 내부 변수 i가 아니라 파라미터를 리턴하도록 하는 방법.
function f() 내부에서 a[i] = (function(x) { ... })(i); 로 파라미터를 받는 함수를 이미 실행시켰다는 것에 주의하자.
파라미터는 0, 1, 2를 차례로 받게 되고, 나중에 alert( b[0]() ); 를 실행하더라도 파라미터를 기억하고 있다가 0, 1, 2를 차례로 리턴하게 된다.
<!DOCTYPE html>
<script type="text/javascript">
function f(){
var a=[];
var i;
for(i=0; i<3; i++){
a[i] = (function(x) {
return function(){
return x;
}
})(i)();
}
return a;
}
var b = f();
alert( b[0] ); // 0
alert( b[1] ); // 1
alert( b[2] ); // 2
</script>
위의 경우 f()의 리턴값인 b 는 클로저가 아니라 배열이다. f() 함수의 선언 내의 for loop 문 안에서
a[i] = (function(x) { ... })(i)(); 에서 함수가 실행되서 a 배열에 function 이 아니라 값이 할당된다.
<!DOCTYPE html>
<script type="text/javascript">
function f(){
var a=[];
var i;
for(i=0; i<3; i++){
a[i] = (function(x) {
return x;
})(i);
}
return a;
}
var b = f();
alert( b[0] ); // 0
alert( b[1] ); // 1
alert( b[2] ); // 2
</script>
위의 경우 전전 예제랑 비슷하지만 for loop 안에서 a[i] 에 할당되는 것이 function(){ return x; } 가 아니라 x; 라는 것이 다르다. 전 예제와 마찬가지로 f() 의 반환값이 클로저가 아니라 배열이다. a 배열의 값의 할당이 funciton f 의 for loop 문 안에서 일어나고, 당연히 0, 1, 2 가 alert 된다.
'Javascript' 카테고리의 다른 글
| [jquery] Simple Modal div 만들기 (데이터 로딩 중 표시) (0) | 2013.06.13 |
|---|---|
| <a href="#"></a> 의 말끔한 대안 (0) | 2013.05.03 |
| html5를 지원하게 해주는 라이브러리 (0) | 2013.04.11 |
| [jquery] xml 노드 객체를 String으로 변환하기 (0) | 2013.04.03 |
| [jquery] ajax 에서 HTTP Request Header 값 넣기. (0) | 2013.04.03 |