์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ •์„ ๐ŸŸก

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - callback ํ•จ์ˆ˜

์ฝ”๋”ฉํ•˜๋Š” ํฌ๋ฃจ 2023. 9. 17. 00:41

 (์ฐธ๊ณ ์ž๋ฃŒ: ์ธํ”„๋Ÿฐ ๊ฐ•์˜ - ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(callback ํ•จ์ˆ˜)  

 

callback function: ํšŒ์‹ ํ•˜๋Š” ํ•จ์ˆ˜ 

 

์ œ์–ด๊ถŒ ์œ„์ž„ํ•˜๋Š” ๊ฒฝ์šฐ: 

1. ์‹คํ–‰ ์‹œ์ 

2. ๋งค๊ฐœ ๋ณ€์ˆ˜

3. this 

 

1. ์‹คํ–‰ ์‹œ์  

 

์˜ˆ์‹œ ํ•จ์ˆ˜)

setInterval(callback, milliseconds)

var cd= function(){
    console.log('1์ดˆ ๋งˆ๋‹ค ์‹คํ–‰๋  ๊ฒ๋‹ˆ๋‹ค')
};
setInterval(cd, 1000);

์ด๋Ÿฌ๋ฉด setInterval์ด ์•Œ์•„์„œ callback ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์คŒ -> ์ œ์–ด๊ถŒ์„ setInterval์—๊ฒŒ ์œ„์ž„ํ•ด์ฃผ๋Š” ๊ฒƒ

 

2. ๋งค๊ฐœ๋ณ€์ˆ˜ (์˜ˆ๋ฅผ๋“ค์–ด, forEach)

var arr = [1,2,3,4,5];
var entries = [];
arr.forEach(function(v, i){
    entries.push([i, v, this[i]]);
},[10,20,30,40,50]);
console.log(entries);

v๋Š” arr์— ์žˆ๋Š” ๊ฐ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ 1,2,3,4,5์˜ ๊ฐ’ ์ถœ๋ ฅ

i๋Š” ์ธ๋ฑ์Šค

this[i]๋Š” 10,20,30,40,50 ์ด๊ฑฐ๋Š” ๋‘๋ฒˆ์งธ ์ธ์ž๋“ค์˜ ๊ฐ’

 ์ฆ‰, forEach๋Š” ์ธ์ž1(์ฝœ๋ฐฑํ•จ์ˆ˜), ์ธ์ž2(this๋ฅผ ์ธ์‹ํ•  ๋Œ€์ƒ)

forEach(๋งค๊ฐœ๋ณ€์ˆ˜)๊ฐ€ ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ์•ผ๋งŒ ํ•จ 

 

3. this

 

this์—๋Š” currenTarget์ด ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

document.body.innerHTML = '<div id="a">abc</div>';
function cbFunc(x){
    console.log(this, x);
}

document.getElementById('a').addEventListener('click',cbFunc);

// addEventListener(type, callback, option);

addEventListner์— cbFunc์•ˆ์— ์žˆ๋Š” this๋Š” id๊ฐ€ a์ธ div element๋กœ ์ž๋™์œผ๋กœ ์ง€์ •. -> event ๊ฐ์ฒด๋กœ ์ž๋™ ์ง€์ •๋˜๋Š” ํ•จ์ˆ˜

๊ทธ๋ ‡๋‹ค๋ฉด this๋ฅผ obj๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์„๊นŒ?

 ๊ทธ๋ ‡๋‹ค๋ฉด, bind ํ•จ์ˆ˜๋ฅผ ์“ฐ์ž !

document.getElementById('a').addEventListener('click',cbFunc.bind(obj));

 


์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํŠน์ง•: 

1. ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ–๋Š”๋‹ค. 

2. ๊ฐ„ํ˜น ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

3. ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“์€ ๋ฐฉ์‹์ด๋ผ๋ฉด, ์–ด๋–ค ์‹œ์ ์—์„œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ• ์ง€, ์ธ์ž๋Š” ์–ด๋–ค ๊ฐ’๋“ค์„ ์ง€์ •ํ• ์ง€, this์— ๋ฌด์—‡์„ ๋ฐ”์ธ๋”ฉํ• ์ง€ ๋“ฑ


 

์ฃผ์˜! ์ฝœ๋ฐฑ์€ ํ•จ์ˆ˜๋‹ค ! 

var arr=[1,2,3,4,5];
var obj = {
    vals: [1,2,3],
    logValues: function(v, i){
        if(this.vals){
            console.log(this.vals,v,i); //์ด ์ถœ๋ ฅ ๊ฐ’์ด ๋‚˜์˜ด
        } else{
            console.log(this, v, i);
        }
    }
};
obj.logValues(1,2);

//๊ฒฐ๊ณผ
[ 1, 2, 3 ] 1 2

//but
arr.forEach(obj.logValues);

obj.logValues๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๋กœ์„œ ํ˜ธ์ถœ. ์™œ๋ƒ๋ฉด ์•ž์— ์ ์ด ์žˆ์œผ๋‹ˆ๊นŒ. ์ด๋•Œ์˜ this๋Š” obj

 

ํ•˜์ง€๋งŒ, //but ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, forEach๋•Œ๋ฌธ์— ํ˜ธ์ถœ์„ ํ•˜์ง€์•Š์Œ. ํ˜ธ์ถœ์€ forEach๊ฐ€ ํ•  ๊ฒƒ์ž„ 

forEach๊ฐ€ ๊ถŒํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— forEach๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๋ƒ์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง 

๊ทธ๋ž˜์„œ, obj.logValues๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ „๋‹ฌ์ด ๋จ. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ์•„๋‹˜ 

๊ทธ๋ž˜์„œ obj.logValues๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๋งŒ ๋–ผ์–ด์„œ ์ „๋‹ฌ. ํ•จ์ˆ˜๋กœ์จ ์ „๋‹ฌ. 

๊ทธ๋ž˜์„œ this๋Š” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋˜์–ด๋ฒ„๋ฆผ