자바스크립트(JavaScript)와 클로저
Posted 2007. 1. 30. 23:56자바 스크립트는 함수형 언어들과 마찬가지로 클로저(closure)를 지원한다.
위 함수 sayHello()의 리턴 값은 또 다른 함수인 function() { alert(text); }이다. 이렇게 얻은 함수는 다음과 같이 호출할 수도 있다.
함수 안에 함수를 정의하는 중첩 함수(nested function)의 개념은 어렵지 않지만, 클로저는 중첩 함수에 대한 단순 함수 포인터만은 아니다. sayHello() 함수에서 text는 지역 변수이므로 스택에 할당하는 구조를 따른다면 sayHello() 함수가 리턴된 후에는 더 이상 text 변수의 값을 읽을 수 없어야 한다. 자바스크립트에서 function() { alert(text); } 같이 클로저를 선언하면 클로저 내부에서 참조하는 지역 변수인 text를 마치 힙에 할당한 것처럼 보존한다. (즉 클로저에 대한 감춰진 포인터가 하나 더 있는 셈이다.) 따라서 sayHello() 함수가 리턴된 후에도 클로저를 호출했을 때 text 변수의 값을 읽을 수 있는 것이다.
자세한 내용은 참고 문서를 참조하기 바란다.
참고 문서
[1] JavaScript Closures 101- they're not magic
http://www.javascriptkit.com/javatutors/closures.shtml
[2] More closure examples
http://www.javascriptkit.com/javatutors/closures2.shtml
function sayHello(name) {
var text = 'Hello ' + name; // local variable
var sayAlert = function() { alert(text); }
return sayAlert;
}
var text = 'Hello ' + name; // local variable
var sayAlert = function() { alert(text); }
return sayAlert;
}
위 함수 sayHello()의 리턴 값은 또 다른 함수인 function() { alert(text); }이다. 이렇게 얻은 함수는 다음과 같이 호출할 수도 있다.
var fun = sayHello('Jane')
fun();
fun();
함수 안에 함수를 정의하는 중첩 함수(nested function)의 개념은 어렵지 않지만, 클로저는 중첩 함수에 대한 단순 함수 포인터만은 아니다. sayHello() 함수에서 text는 지역 변수이므로 스택에 할당하는 구조를 따른다면 sayHello() 함수가 리턴된 후에는 더 이상 text 변수의 값을 읽을 수 없어야 한다. 자바스크립트에서 function() { alert(text); } 같이 클로저를 선언하면 클로저 내부에서 참조하는 지역 변수인 text를 마치 힙에 할당한 것처럼 보존한다. (즉 클로저에 대한 감춰진 포인터가 하나 더 있는 셈이다.) 따라서 sayHello() 함수가 리턴된 후에도 클로저를 호출했을 때 text 변수의 값을 읽을 수 있는 것이다.
자세한 내용은 참고 문서를 참조하기 바란다.
참고 문서
[1] JavaScript Closures 101- they're not magic
http://www.javascriptkit.com/javatutors/closures.shtml
[2] More closure examples
http://www.javascriptkit.com/javatutors/closures2.shtml
- Filed under : 카테고리 없음