Function.prototype.bind() - JavaScript | MDN
bind() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด ํจ์๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๊ฒ๋๋ ์ฒซ ์ธ์์ value๋ก๋ this ํค์๋๋ฅผ ์ค์ ํ๊ณ , ์ด์ด์ง๋ ์ธ์๋ค์ ๋ฐ์ธ๋๋ ํจ์์ ์ธ์์ ์ ๊ณต๋ฉ๋๋ค.
developer.mozilla.org
bind() ๋ฉ์๋๊ฐ ์ค๋ฌด์์ ์ฌ์ฉ๋๋ ์ฃผ์ ๊ฒฝ์ฐ
1. ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this ์ปจํ ์คํธ ๊ณ ์
<button id="myButton">Click Me</button>
const myObject = {
name: 'MyObject',
handleClick: function(event) {
// bind๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ์ฌ๊ธฐ์ this๋ ๋ณดํต <button> ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
console.log(`ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์!`);
console.log(`this์ name ์์ฑ:`, this.name); // bind ๋๋ถ์ myObject์ name์ ์ ๊ทผ
console.log(`์ด๋ฒคํธ ํ์
:`, event.type);
}
};
const button = document.getElementById('myButton');
// --- bind๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ (์ฃผ์ ์ฒ๋ฆฌ) ---
// button.addEventListener('click', myObject.handleClick);
// ์ด ๊ฒฝ์ฐ, handleClick ๋ด๋ถ์ this๋ ๋ฒํผ ์์(<button>)๊ฐ ๋์ด this.name์ undefined ๋๋ ๋น ๋ฌธ์์ด์ด ๋ฉ๋๋ค.
// --- bind๋ฅผ ์ฌ์ฉํ์ฌ this๋ฅผ myObject๋ก ๊ณ ์ ํ ๊ฒฝ์ฐ ---
button.addEventListener('click', myObject.handleClick.bind(myObject));
// ์ด์ handleClick ๋ด๋ถ์ this๋ ํญ์ myObject๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
console.log("๋ฒํผ์ ํด๋ฆญํด ๋ณด์ธ์.");
์ค๋ช : myObject.handleClick ๋ฉ์๋๋ฅผ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ์ฌ์ฉํ ๋, bind(myObject)๋ฅผ ํตํด handleClick ํจ์ ๋ด๋ถ์ this๊ฐ ํด๋ฆญ๋ ๋ฒํผ ์์๊ฐ ์๋ myObject ์์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๊ณ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ์๋ ์์์ this.name๊ณผ ๊ฐ์ด ๊ฐ์ฒด์ ์์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
2. ๋น๋๊ธฐ ์ฝ๋ฐฑ์์ this ์ปจํ ์คํธ ๊ณ ์ (setTimeout ์์)
const timerObject = {
message: '์๊ฐ์ด ๋ค ๋์ต๋๋ค!',
logMessage: function() {
// bind๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ์ฌ๊ธฐ์ this๋ ์ ์ญ ๊ฐ์ฒด ๋๋ undefined์
๋๋ค.
console.log(this.message); // bind ๋๋ถ์ timerObject์ message์ ์ ๊ทผ
}
};
// --- bind๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ (์ฃผ์ ์ฒ๋ฆฌ) ---
// setTimeout(timerObject.logMessage, 1000);
// 1์ด ํ ์คํ ์ logMessage ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด ๋๋ undefined๊ฐ ๋์ด this.message๋ ์์๋๋ก ์ถ๋ ฅ๋์ง ์์ต๋๋ค.
// --- bind๋ฅผ ์ฌ์ฉํ์ฌ this๋ฅผ timerObject๋ก ๊ณ ์ ํ ๊ฒฝ์ฐ ---
setTimeout(timerObject.logMessage.bind(timerObject), 1000);
// 1์ด ํ ์คํ ์ logMessage ๋ด๋ถ์ this๋ timerObject๊ฐ ๋์ด ๋ฉ์์ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
console.log("1์ด ํ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ ๊ฒ์
๋๋ค.");
์ค๋ช : setTimeout์ ์ฝ๋ฐฑ ํจ์๋ก timerObject.logMessage๋ฅผ ์ ๋ฌํ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋ฐฑ ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด(window) ๋๋ undefined๊ฐ ๋ฉ๋๋ค. bind(timerObject)๋ฅผ ์ฌ์ฉํ์ฌ logMessage๊ฐ ์คํ๋ ๋ this๊ฐ timerObject๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๊ณ ์ ํฉ๋๋ค.
3. ๊ฐ์ฒด์์ ๋ฉ์๋๋ง ๋ถ๋ฆฌ ์ this ์ ์ง
const calculator = {
value: 10,
add: function(a) {
// bind๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ์ฌ๊ธฐ์ this๋ ์์๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
return this.value + a;
}
};
// ๋ฉ์๋๋ง ๋ณ๋ ๋ณ์์ ํ ๋น
const addMethod = calculator.add;
// --- bind๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ---
// console.log(addMethod(5));
// addMethod๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ํธ์ถํ๋ฉด this๋ ์ ์ญ ๊ฐ์ฒด ๋๋ undefined๊ฐ ๋์ด
// this.value๋ ์์๋๋ก 10์ด ์๋๋ฏ๋ก NaN ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
// --- bind๋ฅผ ์ฌ์ฉํ์ฌ this๋ฅผ calculator๋ก ๊ณ ์ ํ ์๋ก์ด ํจ์ ์์ฑ ---
const boundAddMethod = calculator.add.bind(calculator);
// boundAddMethod๋ฅผ ํธ์ถํ๋ฉด this๊ฐ calculator๋ก ๊ณ ์ ๋์ด ์์ต๋๋ค.
console.log(`bind ์ฌ์ฉ ๊ฒฐ๊ณผ: ${boundAddMethod(5)}`); // ์ถ๋ ฅ: bind ์ฌ์ฉ ๊ฒฐ๊ณผ: 15
์ค๋ช : calculator.add ๋ฉ์๋๋ฅผ addMethod๋ผ๋ ๋ณ์์ ํ ๋นํ๋ฉด, addMethod๋ ๋ ์ด์ calculator ๊ฐ์ฒด์ ๋ฉ์๋๋ก ์ทจ๊ธ๋์ง ์์ต๋๋ค. addMethod(5)์ ๊ฐ์ด ๋ ๋ฆฝ์ ์ผ๋ก ํธ์ถํ๋ฉด this๊ฐ ๊นจ์ง๋๋ค. bind(calculator)๋ฅผ ํตํด this๊ฐ ํญ์ calculator๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ก์ด ํจ์ boundAddMethod๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
4. ๋ถ๋ถ ์ ์ฉ (์ธ์ ๋ฏธ๋ฆฌ ์ค์ )
const displayInfo = function(prefix, suffix, data) {
console.log(`${prefix} ${data} ${suffix}`);
};
// --- 'Log:' ์ ๋์ฌ์ '.' ์ ๋ฏธ์ฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํ ์๋ก์ด ํจ์ ์์ฑ ---
const logWithSuffix = displayInfo.bind(null, 'Log:', '.'); // this๋ ์ค์ํ์ง ์์ null ์ฌ์ฉ
// ์ด์ logWithSuffix ํจ์๋ data ์ธ์ ํ๋๋ง ๋ฐ์ผ๋ฉด ๋ฉ๋๋ค.
logWithSuffix('๋ฐ์ดํฐ1'); // displayInfo('Log:', '.', '๋ฐ์ดํฐ1') ์ ๋์ผํ๊ฒ ์๋
logWithSuffix('๋ฐ์ดํฐ2'); // displayInfo('Log:', '.', '๋ฐ์ดํฐ2') ์ ๋์ผํ๊ฒ ์๋
console.log("์ธ์๊ฐ ๋ฏธ๋ฆฌ ์ค์ ๋ ํจ์๋ฅผ ํธ์ถํ์ต๋๋ค.");
์ค๋ช : displayInfo ํจ์๋ ์ธ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ง๋ง, bind(null, 'Log:', '.')๋ฅผ ์ฌ์ฉํ์ฌ this๋ ๋ฌด์ํ๊ณ (null ์ฌ์ฉ), ์ฒซ ๋ ์ธ์('Log:', '.')๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ ํ ์๋ก์ด ํจ์ logWithSuffix๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด์ logWithSuffix๋ ๋๋จธ์ง ๋ง์ง๋ง ์ธ์(data)๋ง ๋ฐ์๋ displayInfo ํจ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋ ์ ์๋๋ก ์ค๋น๋์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก '๋ถ๋ถ ์ ์ฉ'์ ๋๋ค.
์ด ์์ ๋ค์ ํตํด bind()๊ฐ this ๊ณ ์ ๊ณผ ์ธ์ ์ฌ์ ์ค์ ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ์ญํ ์ ์ด๋ป๊ฒ ์ํํ๋์ง ์ดํดํ์ค ์ ์์ ๊ฒ์ ๋๋ค.
- this ์ปจํ ์คํธ ๊ณ ์ : ์ด๊ฒ์ด bind()๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ฃผ๋ ๋ชฉ์ ์ด์ ์ด์ ๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด์ this๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ์ํฉ์์ this๋ฅผ ๋ช ์์ ์ผ๋ก ๊ณ ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ถ๋ถ ์ ์ฉ (์ธ์ ๋ฏธ๋ฆฌ ์ค์ ): ์ธ์๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํ๋ ๊ธฐ๋ฅ๋ bind()์ ์ ์ฉํ ํ์ฉ๋ฒ์ด์ง๋ง, this ์ปจํ ์คํธ ๋ฌธ์ ํด๊ฒฐ๋งํผ ์์ฃผ ์ฌ์ฉ๋์ง๋ ์๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ(ํด๋ก์ ๋ฑ)์ผ๋ก ๋์ฒด๋๊ธฐ๋ ์ฝ์ต๋๋ค.
const greet = (greeting, name) => {
console.log(`${greeting}, ${name}!`);
};
// 'Hello'๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฏธ๋ฆฌ ๊ณ ์ ํ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
const sayHello = greet.bind(null, 'Hello');
sayHello('World'); // ์ฌ๊ธฐ์ 'World'๋ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
// ๊ฒฐ๊ณผ: Hello, World!
sayHello('Jane'); // ์ฌ๊ธฐ์ 'Jane'์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
// ๊ฒฐ๊ณผ: Hello, Jane!
bind()๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ๋ด์ฅ ๋ฉ์๋์ ๋๋ค. bind()๋ฅผ ํธ์ถํ๋ฉด ์๋ณธ ํจ์์ this ๊ฐ์ ์๊ตฌ์ ์ผ๋ก ๊ณ ์ ํ๊ณ , ์ ํ์ ์ผ๋ก ์ผ๋ถ ์ธ์๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํ ์๋ก์ด ํจ์๋ฅผ ์์ฑํ์ฌ ๋ฐํํฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ bind()๋ฅผ ํธ์ถํ๋ค๊ณ ํด์ ์๋ณธ ํจ์๊ฐ ์ฆ์ ์คํ๋๋ ๊ฒ์ ์๋๋ผ๋ ๊ฒ์ ๋๋ค. bind()๋ "๋์ค์ ์คํ๋ ํจ์์ ํ๊ฒฝ์ ๋ฏธ๋ฆฌ ์ค์ ํด๋๋" ์ญํ ์ ํฉ๋๋ค.
์ค๋ฌด์์ bind()๊ฐ ํ์ฉ๋๋ ๋ ๊ฐ์ง ์ฃผ์ ๊ฒฝ์ฐ
- this ์ปจํ
์คํธ ๊ณ ์
- ๋ฌธ์ : ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์์ this ๊ฐ์ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌํ ๋, ์๋ ๋ฉ์๋๊ฐ ์ํด ์๋ ๊ฐ์ฒด์์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด์ this๊ฐ ์์์น ๋ชปํ ๊ฐ(์: ์ ์ญ ๊ฐ์ฒด๋ undefined)์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค.
- bind()์ ์ญํ : bind()๋ ์ด๋ ๊ฒ this ์ปจํ ์คํธ๊ฐ ๊นจ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ this๊ฐ ํญ์ ์๋ ์๋ํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๊ณ ์ ์์ผ ์ค๋๋ค.
- ์ค๋ฌด ์์:
- ์ด๋ฒคํธ ํธ๋ค๋ฌ: DOM ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ผ ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑ ํจ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (element.addEventListener('click', myObject.handleClick.bind(myObject))) handleClick ๋ด๋ถ์ this๊ฐ ํด๋ฆญ๋ element๊ฐ ์๋ myObject๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ง๋ญ๋๋ค.
- ๋น๋๊ธฐ ์ฝ๋ฐฑ: setTimeout, setInterval, Promise์ then ๋ฑ ๋น๋๊ธฐ ์์ ์ ์ฝ๋ฐฑ ํจ์๋ก ๊ฐ์ฒด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ this๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
- ํด๋์ค ์ปดํฌ๋ํธ ๋ฉ์๋: React ํด๋์ค ์ปดํฌ๋ํธ ๋ฑ์์ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ์ผ๋ก ์ ๋ฌํ ๋ this๊ฐ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋๋ก bind๋ฅผ ์ฌ์ฉํ์ต๋๋ค (์ต๊ทผ์๋ ํ์ดํ ํจ์๋ ํด๋์ค ํ๋ ๋ฌธ๋ฒ์ผ๋ก ๋์ฒด๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค).
- ๋ถ๋ถ ์ ์ฉ (Partial Application) - ์ธ์ ๋ฏธ๋ฆฌ ์ค์
- ๋ฌธ์ : ์ด๋ค ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ฐ, ์ด ํจ์๋ฅผ ๋ค๋ฅธ ํจ์(์: ์ ์์์ combine)์ ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์ด๋ ์ฝ๋ฐฑ์ ํธ์ถํ๋ ํจ์๋ ๋ฏธ๋ฆฌ ์ ํด์ง ๊ฐ์(์: ํ๋)์ ์ธ์๋ง ์ ๋ฌํ๋๋ก ๋์ด ์์ด, ์๋ ํจ์๊ฐ ํ์๋ก ํ๋ ๋ชจ๋ ์ธ์๋ฅผ ํ ๋ฒ์ ์ ๋ฌ๋ฐ๊ธฐ ์ด๋ ต์ต๋๋ค.
- bind()์ ์ญํ : bind()๋ this ๊ฐ ๊ณ ์ ๋ฟ๋ง ์๋๋ผ, bind() ํธ์ถ ์ ๋ ๋ฒ์งธ ์ธ์๋ถํฐ ์ ๋ฌ๋ ๊ฐ๋ค์ ์๋ก ์์ฑ๋ ํจ์๊ฐ ํธ์ถ๋ ๋ ์๋ณธ ํจ์๋ก ์ ๋ฌ๋ ์ธ์๋ค์ ๋งจ ์์ ๊ณ ์ ์์ผ ์ค๋๋ค. ์ด๋ ๊ฒ ์ผ๋ถ ์ธ์๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด๋๊ณ ๋๋จธ์ง ์ธ์๋ ๋์ค์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ถ๋ถ ์ ์ฉ์ด๋ผ๊ณ ํฉ๋๋ค.
- ์ค๋ฌด ์์:
- ๋ฒ์ฉ ํจ์ ํน์ํ: ํน์ ์ค์ ๊ฐ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ง๊ณ ๋์ํ๋ ํจ์๋ฅผ ๋ฒ์ฉ ํจ์๋ก๋ถํฐ ๋ง๋ค ๋ ์ฌ์ฉํฉ๋๋ค. (์ ์์์ showResult ํจ์์ฒ๋ผ, ๋ฉ์์ง ํ ์คํธ๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ ํจ์๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ถ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ: ์ด๋ฒคํธ ๊ฐ์ฒด ์ธ์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ ์ถ๊ฐ๋ก ๋๊ฒจ์ผ ํ ๋ bind()์ ๋ ๋ฒ์งธ ์ธ์๋ถํฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค (์ญ์ ํ์ดํ ํจ์์ ํด๋ก์ ๋ก ๋์ฒด๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค).
'๐ป FE > ๐ JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ์ปดํฌ๋ํธ ๊ฐ ์ํ ๊ณต์ (Context API) (0) | 2025.07.02 |
---|---|
"ํจ์๋ ๊ฐ์ฒด๋ค" (0) | 2025.05.13 |
๋ค์ํ ํ์ดํ ํจ์ ๊ตฌ๋ฌธ (0) | 2025.05.13 |
์ฌ๊ท์ ์ (0) | 2025.04.26 |
์๋ฐ์คํฌ๋ฆฝํธ์์ on๊ณผ handle์ ๊ด๊ณ์ ๋ํด ์์๋ณด์๋ค. (0) | 2025.04.20 |