D+44
- call, apply, bind ๋ฉ์๋ -
(call, apply, bind)
call ๊ณผ apply
call๊ณผ apply๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก this๋ฅผ ์ง์ ํ๊ณ ์ถ์๋ ์ฌ์ฉํ๋ค๊ณ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ ์ ์์ผ๋ฉฐ, ์ฒซ๋ฒ์งธ ์ธ์๊ฐ ํญ์ this๊ฐ์ด ๋ฉ๋๋ค.
์ด ๋์ ์ฐจ์ด์ ์ .apply๋ ๋ฐฐ์ด๋ก ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ , .call์ ๊ทธ๋ฅ ๋จ์ํ ๊ฐ์ ์ ๋ ฅํ๋ฉด ๋๊ฒจ์ค๋ค๋ ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
function add(x, y) {
return x + y;
}
add.apply(null, [2, 8]); // 10
add.call(null, 2, 8); // 10
bind
.bind๋ .call๊ณผ ์ ์ฌํ๊ฒ this ๋ฐ ์ธ์๋ฅผ ๋ฐ์ธ๋ฉ ํ์ง๋ง ๋น์ฅ ์คํํ๋ ๊ฒ์ด ์๋ ๋ฐ์ธ๋ฉ ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ this, ๋๋ฒ์งธ ์ธ์๋ถํฐ๋ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ค.
fn.bind(this๊ฐ, ์ธ์1, ์ธ์2, ...)
case 1: ์ด๋ฒคํธ ํธ๋ค๋ฌ
bind๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์ด๋ฒคํธ ๊ฐ์ฒด ๋์ ๋ค๋ฅธ ๊ฐ์ ์ ๋ฌํ๊ณ ์ ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
<!DOCTYPE html>
<html>
<body>
<button id="btn"> ํด๋ฆญํ์ธ์ </button>
</body>
</html>
html ํ์ผ
let btn = document.querySelector('#btn')
btn.onclick = handleClick
function handleClick() {
console.log(this) // <button id="btn"> ํด๋ฆญํ์ธ์ </button>
}
js ํ์ผ
bind๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด๋ฒคํธ๊ฐ์ฒด๊ฐ ๋ฐ๋ก ๋์ค๊ฒ ์ง๋ง
bind๋ฅผ ์ฌ์ฉํด ์ฃผ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๊ฐ์ด ๋์ค๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
let btn = document.querySelector('#btn')
btn.onclick = handleClick.bind({ hello: 'world'})
function handleClick() {
console.log(this) // {hello: 'world'}
}
js ํ์ผ
case 2: setTimeout
setTimeout์ ์๊ฐ ์ง์ฐ์ ์ผ์ผํจ ํ ํจ์๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ๊ฒ ํ๋ ํจ์๋ก
๋ช ์์ ์ผ๋ก ํญ์ window ๊ฐ์ฒด๋ฅผ this ๋ฐ์ธ๋ฉํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
์๋์ ์ฝ๋์ฒ๋ผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ง์ฐฌ๊ฐ์ง๋ก setTimeout์ผ๋ก ์ธํ ํจ์๋ก
ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
class Rectangle {
constructor(width, height) {
this.width = width
this.height = height
}
getArea() {
return this.width * this.height
}
printArea() {
console.log('์ฌ๊ฐํ์ ๋์ด๋ ' + this.getArea() + ' ์
๋๋ค')
}
printSync() {
// ์ฆ์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ฝ์์ ํ์ํฉ๋๋ค
this.printArea()
}
printAsync() {
// 1์ด ํ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ฝ์์ ํ์ํฉ๋๋ค
setTimeout(this.printArea, 2000)
}
}
let box = new Rectangle(40, 20)
box.printSync() // '์ฌ๊ฐํ์ ๋์ด๋ 800 ์
๋๋ค'
box.printAsync() // ์๋ฌ ๋ฐ์!
์ค๋ฅ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ๋ค๋ฉด ์ ํ์ ์์ ์๋ this.printArea๋ฅผ
this.printArea.bind(this)๋ก ์์ ํด ์ค๋ค๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ด๋ค.
'์๋ > Code-States' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[D+46] ์คํ๊ณผ ํ (0) | 2020.10.22 |
---|---|
[D+45] ESlint ์ค์นํ๊ธฐ (0) | 2020.10.21 |
[D+44] ํ์ดํ ํจ์, ๊ตฌ์กฐ๋ถํด ํ ๋น, this (0) | 2020.10.20 |
[D+43] node.js์ ๊ด๋ จ ๋๊ตฌ (0) | 2020.10.19 |
[D+42] Pre Course๋ฅผ ๋ง์น๋ฉฐ... (0) | 2020.10.18 |
๋๊ธ