본문 바로가기

Node

Node.js - 콜백함수, 클로저(Closure)

1. 콜백함수

Node.js의 가장 핵심적인 부분 - 콜백함수 (비동기 방식의 함수, Non-Block)

 

왜 중요한가?

콜백인 함수에서 콜백을 사용하지 않게 된다면, 콜백 함수의 과정이 끝나기 전에 다음 프로세스를 진행하게 되는 경우가 있다. (ex. db에서 값을 읽어들일 때 값을 읽기 전에 출력을 해버리는 경우)

내용이 복잡해질수록 여러개의 callback이 계속된다.

 

 

- 함수를 호출했을 때 또 다른 함수를 파라미터로 전달

- 함수안에 콜백함수가 들어가있는 상태

function add(a,b,callback) {
	
	var result = a + b;
	callback(result);
	
}

add(10,20,function(result) {
	console.log("더하기 결과: " + result);
});

더하기 결과: 30

 

 

// 함수가 결과값으로 리턴되는 형태 
function add(a,b,callback) {
	
	var result = a + b;
	callback(result);	
	
	var history = function() {
		return a + "+" + b + "=" + result;	
	};
	
	return history; 
}

//function(result) = callback함수인것
var history = add (10,20,function(result){
	console.log("더하기 결과: " + result);
});

console.log("결과값으로 받은 함수 실행 결과: "
		+ history());

더하기 결과: 30
결과값으로 받은 함수 실행 결과: 10+20=30

 

2. 클로저 (Closure) 

클로저: 리턴된 함수에서 자신을 만들어준 함수 내의 변수에 접근하는 것
함수 안에서 새로운 함수를 만들어서 변환하는 경우에는 예외적으로 변수 접근을 허용한다

function add(a,b,callback){
	
	var result = a + b;
	
	callback(result);
	
	var count = 0; // history 실행 횟수
	
	var history = function() {
		
		count ++;
		return count + ":" + a + "+"
			+ b + "=" + result;
		
	};
	
	return history;
			
}

var history = add(10,20,function(result){
	console.log("더하기 결과:" + result);
})

// 자신을 만들어준 함수 내의 변수에 접근하기
console.log("결과값:" + history());
console.log("결과값:" + history());
console.log("결과값:" + history());

 

 

 

어떤 언어도 이미 지나온 for문(반복문)을 다시 접근할 수 없다. 다시 접근하고 싶으면 function add() 자체를 실행해야 한다
하지만 Closure를 이용하면 var history (함수안의 함수)를 실행하여 반복문을 다시 쓸 수 있는 것이다

 

다시 말해, 

history 함수가 호출될 때는 add 함수를 다시 접근할 수 없다. (내부에서 외부를 다시 호출할 수 없다)
add 함수 안에 만들어진 count 변수도 접근이 불가능하다. (내부에서 외부 변수를 접근할 수 없다)

단, 함수 안에서 함수를 만들어 변환하는 경우에는 접근을 허용하는 것이다 (Closure)

 

Closure 조건

1. 함수 안에 함수를 만들고

2. 그 변수가 계속 값을 바뀌게 할 때 (count++) access할 수 있는 것