B11 : ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ

2025. 8. 17. 02:55ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ

2. call(), apply()

    2-1. call() ๋ฉ”์„œ๋“œ

    2-2. apply() ๋ฉ”์„œ๋“œ

3. bind()


1. ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด(First-class Object)๋กœ, ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ค‘ ํ•จ์ˆ˜ ๊ฐ์ฒด์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค๋“ค์„ ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ์ง€๋งŒ ์ฃผ์š” ํ•จ์ˆ˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ ๋ช‡ ๊ฐ€์ง€๋งŒ ๋‹ค๋ค„๋ณด์ž.


2. call(), apply()

call()๊ณผ apply() ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ํ•จ์ˆ˜(๊ฐ์ฒด)๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.

๋‘ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์€ ๋„˜๊ฒจ๋ฐ›๋Š” ์ธ์ž์˜ ํ˜•์‹์ด๋‹ค.


1. call() ๋ฉ”์„œ๋“œ

ํŠน์ • ๊ฐ์ฒด๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ, ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•œ๋‹ค. 

 

// 1. obj ๊ฐ์ฒด๋ฅผ call()๋ฉ”์„œ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ this๋กœ ๋ฐ”์ธ๋”ฉ

const obj = {name: 'Bang'};

function greeting() {
	return `Hello ${this.name}`;
}

console.log(greeting.call(obj));	// 'Hello Bang'



// 2. ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ธ์ž๋ฅผ ์ „๋‹ฌ

const obj = {name: 'Bang'};

function getUserInfo(age, country) {
	return `name: ${this.name}, age: ${age}, country: ${country}`;
}
console.log(getUserInfo.call(obj, 26, 'Korea'));	// name: Bang, age: 26, country: Korea'

 

2. apply() ๋ฉ”์„œ๋“œ

call() ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „๋‹ฌํ•  ์ธ์ž๋“ค์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

const obj = {name: 'Bang'};

function getUserInfo(age, country) {
	return `name: ${this.name), age: ${age}, country: ${country}`;
}

console.log(getUserInfo.apply(obj, [26, 'Korea']));	// 'name: Bang, age: 26, country: Korea'

3. bind()

ํ•จ์ˆ˜์˜ this ๋ฐ”์ธ๋”ฉ์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.(์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ)

bind() ๋ฉ”์„œ๋“œ๋กœ this๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ•จ์ˆ˜๋Š” call(), apply(), ๋˜ ๋‹ค๋ฅธ bind() ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const obj1 = {name: 'Bang'};
const obj2 = {name: 'Kim' };

function getUserInfo(age, country) {
	return `name: ${this.name}, age: ${age}, country: ${country}`;
}

const bound = getUserInfo.bind(obj1);

console.log(bound(26, 'Korea'));	// 'name: Bang, age: 26, country: Korea'
console.log(bound.apply(obj2, [22, 'Korea']));	// 'name: Bang, age: 22, country: Korea'

bound ๋ณ€์ˆ˜์—์„œ bind(obj1)๋กœ ์ธํ•ด this๊ฐ’์ด obj1๋กœ ์˜๊ตฌ ๊ณ ์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— apply๋ฅผ ์‚ฌ์šฉํ•ด๋„ this ๊ฐ’์ด obj1๋กœ ๊ณ ์ •๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•