TIL/JavaScript

[ECMAScript6+를 위한 보충학습] 2. Callback

Art Rudy
728x90
반응형

콜백함수(Callback Function)?

파라미터로 함수를 전달받아, 함수의 내부에서 실행하는 함수이다. 함수를 파라미터로 만들어 전달하는 경우는 대부분 비동기 프로그래밍 방식으로 코드를 만들 때이다. 예를 들어 더하기 함수를 실행한 후 결과 값이 반환될 때까지 기다리지 않고 그 다음 코드를 실행하려면 비동기 방식으로 코드를 만들어야 한다. , 더하기 함수를 실행하는 데 시간이 걸릴 수 있기 때문에 그 다음 코드를 바로 실행한다. 그리고 나서 연산이 끝났을 때 파라미터로 전달한 함수가 실행될 수 있다면 그 시점에 결과를 처리할 수 있으므로 효율적인 프로그램을 만들 수 있다. 이때 파라미터로 전달되는 함수를 콜백함수(Callback Function)라고 한다. 콜백함수는 함수가 실행되는 중간에 호출되어 상태 정보를 전달하거나 결과 값을 처리하는 데 사용된다.

 

콜백 함수 예시 코드

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

add(10, 10, function(result){
    console.log('파라미터로 전달된 콜백 함수 호출');
    console.log('더하기 (10, 10)의 결과 : %d', result);
});

  

더하기 함수를 정의할 때는 더 이상 값을 반환하지 않도록 return 키워드를 사용하는 코드 부분을 삭제한다. 그 대신 더하기 연산을 한 결과 값은 파라미터로 전달된 콜백함수를 호출하면서 그 콜백함수로 전달한다. 콜백함수는 미리 변수에 할당해 두었다가 add() 함수를 호출할 때 파라미터로 전달할 수도 있지만, add() 함수를 호출할 때 익명 함수로 만들어서 파라미터로 바로 전달할 수도 있다. 콜백함수는 더하기 연산을 하는 코드 아래에서 호출되는데 이때 콘솔에 메시지를 출력한다.

 

함수 안에서 값을 반환할 때 새로운 함수를 만들어 반환하는 방법 예시 코드

function multiply(a, b, callback){
    var result = a*b;
    callback(result);

    var history = function(){
        return a + '*' + b + '=' + result
    }
    return history
}

var multi_history = multiply(10, 10, function(result){
    console.log(result);
});

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

 

> 100
> 결과 값으로 받은 함수 실행 결과 : 10*10=100

 

콜백함수 사용 시 this 객체에 유의

var obj = {
    name: "Rudy",
    email: "empty",
    setEmail : function(email){
        this.email = email;
    }
}

function setEmail_function(email, callback){
    callback(email);
}

setEmail_function("example.com", obj.setEmail);
console.log(obj.email);
console.log(window.email);

 

obj 변수에 있는 setEmail 함수는 email을 인자로 받아 obj 객체의 email 프로퍼티 값을 바꾸는 함수이다. setEmail 함수에서는 obj 객체를 참조할 목적으로 this.email = email 코드가 있다. 위의 예제를 실행하면, 과연 email 프로퍼티 값이 바뀌었을까?

 

setEmail_function() 함수를 실행할 때, 두 번째 인자(callback() 함수) obj.setEmail 함수를 전달했다. , example.com 이라는 값으로 obj.email 프로퍼티 값이 바뀌기를 기대하고 실행한 것이다. 그러나 setEmail_function() 함수 내에서 콜백함수 setEmail 함수가 실행될 때this는 전역 객체인 window가 된다. 따라서 첫 번째 출력 결과는 'empty'이며, 두 번째 출력 결과는 example.com가 된다.

 

이와 같은 문제를 해결하기 위해서는 call, apply 메서드를 사용하여 this객체를 명확히 하는 방법이 있다.

 

var obj = {
    name: "Rudy",
    email: "empty",
    setEmail : function(email){
        this.email = email;
    }
}

function setEmail_fucntion(email, callback){
    callback.call(obj, email);
}

callback("example.com", obj.setEmail);
console.log(obj.email);
console.log(window.email);

 

setEmail_function() 함수에서 콜백 함수(callback)를 호출할 때call() 함수를 사용하여 this 객체를 obj라고 명확히 전달했다. 따라서 이 예제에서는 첫 번째 출력 결과는 example.com이 되고, 두 번째 출력 결과는 undefined가 된다.

 

이와 같이 콜백함수를 작성할 때는 this에 주의해야 한다.

728x90
반응형

'TIL > JavaScript' 카테고리의 다른 글

[ECMASciprt6+ Features] 5. Arrow Functions  (0) 2021.07.22
[ECMASciprt6+ Features] 4. let & const  (0) 2021.07.22
[ECMASciprt6+ Features] 3. Class  (0) 2021.07.21
[ECMAScript6+를 위한 보충학습] 1. EventLoop  (0) 2021.07.21
ECMAScript6+  (0) 2021.07.21