๐ก this๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ค!
โ๏ธ ์ ์ญ๊ณต๊ฐ์์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ๋ค. ๊ฐ๋ ์ ์ ์ญ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ ์ฃผ์ฒด๊ฐ ๋ฐ๋ก ์ ์ญ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
var a = 1;
console.log(a); //1
console.log(window.a); //1
console.log(this.a); //1
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๋ณ์๋ ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก์ ๋์ํ๊ธฐ๋๋ฌธ์ var์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋ณ์๋ฅผ ์ ์ธํ๋ฉด window.a
์ this.a
๋ชจ๋ 1๋ก ์ถ๋ ฅ๋๋ค.
๋ฉ์๋๋ก์ ํธ์ถํ๋ ๊ฒฝ์ฐ ํธ์ถ ์ฃผ์ฒด๋ ๋ฐ๋ก ํจ์๋ช ์์ ๊ฐ์ฒด์ด๋ค. โ๏ธ๋ง์ง๋ง ์ ์์ ๋ช ์๋ ๊ฐ์ฒด๊ฐ ๊ณง this์ด๋ค.
์์ฑ์๋ ๊ตฌ์ฒด์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ผ์ข
์ ํ์ด๋ค. ์ฌ๊ธฐ์ ๊ตฌ์ฒด์ ์ธ ์ธ์คํด์ค์ ๊ฐ์ฑ์ ๋ํด ๊ฐ๋ณ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์์ฑ์ ํจ์๋ก์ ํธ์ถ๋ ๊ฒฝ์ฐ ๋ด๋ถ์์์ this๋ ๊ณง ์๋ก ๋ง๋ค ๊ตฌ์ฒด์ ์ธ ์ธ์คํด์ค ์์ ์ด ๋๋ค.
let Cat = function(name, age) {
this.bark = '์ผ์น';
this.name = name;
this.age = age;
}
let nabi = new Cat('๋๋น', 3)
console.log(nabi)
/*
[object Object] {
age: 3,
bark: "์ผ์น",
name: "๋๋น"
}
*/
์ฒซ๋ฒ์งธ ์ธ์๋ฅผ this๋ก ๋ฐ์ธ๋ฉํ๊ณ ์ดํ์ ์ธ์๋ค์ ํธ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ํ๋ค.
let func = function(a,b,c){
console.log(this, a,b,c)
}
func(1,2,3) //{window...}, 1, 2, 3
func.call({a:1}, 2, 3, 4) //{a:1}, 2, 3, 4
call๊ณผ ๊ธฐ๋ฅ์ ์ผ๋ก ์์ ํ ๋์ผํ๊ณ ,
๋๋ฒ์งธ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ๊ทธ ๋ฐฐ์ด์ ์์๋ค์ ํธ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ํ๋ค.
let func = function(a,b,c){
console.log(this, a,b,c)
}
func.apply({a:1}, 2, 3, 4) //{a:1}, 2, 3, 4
๋๊ฒจ ๋ฐ์ this ๋ฐ ์ธ์๋ค์ ๋ฐํ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ด๋ค.
let user = {
firstName: "John"
};
function func() {
alert(this.firstName);
}
let funcUser = func.bind(user);
funcUser(); // John
์ถ๊ฐ์ ์ผ๋ก bind ๋ฉ์๋๋ฅผ ์ ์ฉํด์ ์๋ก ๋ง๋ ํจ์๋ name ํ๋กํผํฐ์ bound
๋ผ๋ ์ ๋์ด๊ฐ ๋ถ๋๋ค. -> ์ฝ๋๋ฅผ ์ถ์ ํ๊ธฐ์ ๋ ์์ํด์ง
ํ์ดํ ํจ์ ๋ด๋ถ์๋ this๊ฐ ์์ ์์ผ๋ฉฐ ์ ๊ทผํ๊ณ ์ ํ๋ฉด ์ค์ฝํ์ฒด์ธ์ ๊ฐ์ฅ ๊ฐ๊น์ด this์ ์ ๊ทผํ๊ฒ ๋๋ค.
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋ณ์๋ก this๋ฅผ ์ฐํํ๊ฑฐ๋ call/apply/bind๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ด ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ํธ๋ฆฌํ๋ค.