본문 바로가기

웹 프로그래밍/JavaScript

[JS] 클로저 개념 및 예제 (예제 추가 필요)

함수가 종료되면서 호출되는 개념이라 클로저라고 붙였을 거라 추측.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
/* 	function returnFunc(name){
		var msg = "반갑습니다." + name + "님!!!";
		
		return msg;
	}
	
	// 아래와 같이 쓰려면, 변수의 지역성이 문제가 된다. 함수가 끝나면 msg 변수는 사라진다.
	alert(msg);
	
	// 어떻게 하면 alert(msg)를 사용할 수 있을까?
			
	
	// 방법(1) return 값으로 msg를 보낸다. 그리고 alert 함수에 담는다.
	var msg = returnFunc('홍길동');
	alert(msg);
	 */
	 
	 // 방법(2) 클로저(return에 위치한 함수) 활용
	function returnFunc(name){
		var msg = "반갑습니다." + name + "님!!!";
		
		return function(){ 
			alert(msg);
		};
	}
	 
	/* returnFunc('최길동');
	alert(msg) // 오류 발생 */
	
	// 아래의 형태에 익숙해지자. 함수를 리턴값으로 받으면 지역변수가 계속 살게된다. 생각과는 다르다.
	var f = returnFunc('조길동');
	f();
	f();
	
	// 더 많이 쓰이는 형태라고 한다. 그런데 이렇게 1회성으로 사용할거면 왜 이런 형태를 쓰는가?
	// 매개변수의 값을 좀 더 유연하게 활용할 수 있기 때문이다. wow!
	// 바로 위의 f(); 형태는 name이 '조길동'인 msg만 활용할 수 있다.
	returnFunc('홍길동')(); 
	returnFunc('박길동')(); 
	returnFunc('임길동')(); 
	
	
</script>
</head>
<body>

</body>
</html>

 

 

<구글링>

클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수를 말한다. 이를 조금 더 간단히 말하면 클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수다라고 말할 수 있겠다.