์ค๋ ์์๋ณผ ๊ฒ์ this
์ด๋ค.
๋๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ธ java๋ฅผ ๋จผ์ ๋ฐฐ์ ๊ธฐ ๋๋ฌธ์ js์์ ๋งํ๋ this๋ฅผ ๋จ์ง class ๋ด๋ถ์ ํ๋กํผํฐ์ ๋ํ ํฌ์ธํฐ์ญํ ๋ก์จ ์ดํด๋ฅผ ํ์์ง๋ง, js์์ ๋งํ๋ this๋ ํจ์ฌ ๋ค์ํ๊ณ ์ฌ์คํ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์์๋ค.
์ค๋ ๊ทธ ์ฌ์คํ ๊ธฐ๋ฅ๋ค์ ๋ํด์ ์ง์ด๋ณด์.
ํด๋น ๊ธ์ 4๋ถ์์ผ๋ก ๋๋์ด์ ธ ์์ต๋๋ค. this์ ๋ํ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ ํ์ ํ๊ณ ์ถ๋ค๋ฉด ํ ๋ฒ ๋ด๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ์ ์ญ ๊ณต๊ฐ์์์ this
- ๋ฉ์๋ ๋ด๋ถ์์์ this
- ํจ์ ๋ด๋ถ์์์ this
- ์ฝ๋ฐฑ ํจ์์์์ this
What is this
์ต๋์ docs๋ฅผ ์ ๊ณตํ๋ค๋ w3c์๋ ๋ค์๊ณผ ๊ฐ์ด this์ ๊ธฐ๋ฅ์ ๋ถ๋ฅํ๋ค.
- ๋ฉ์๋์์
this
๋ ๊ทธ์ ์ฃผ์ธ ๊ฐ์ฒด(Owner Obj)๋ฅผ ๋ปํ๋ค. this
๊ฐ ๋จ๋ ์ผ๋ก ์ฌ์ฉ๋๋ฉด ๊ทธ๊ฒ์ global ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค.- ํจ์์์
this
๋ global ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค. strict mode
๊ฐ ์ ์ฉ๋ ํจ์์์this
๋ undefined์ด๋ค.- ์ด๋ฒคํธ์์
this
๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ element๋ฅผ ๋ปํ๋ค. - call()๊ณผ apply() ๊ฐ์ ๋ฉ์๋์์
this
๋ any object๋ฅผ ๋ปํ๋ค.
๊ฐ๊ฐ์ ์๋ฅผ ํตํด์ ์กฐ๊ธ ์ฝ๊ฒ ์ดํดํด๋ณด์.
๋ชจ๋ ์๋ฆฌ๋ฅผ ํ์ ํ๋๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.
๋จ์ํ ์๊ธฐ๋ฅผ ํด์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋น์ฅ์ ํจ๊ณผ์ ์ผ์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ์ธ์ ์ด๋ค ์ธ์ด๊ฐ ์ด๋ป๊ฒ ์ฌ๋ผ์ง๊ณ ๋ฑ์ฅํ ์ง ๋ชจ๋ฅด๋ ํ์ฌ์๋ ์ธ์ด์ ์ฌ์ฉ๋ฒ๋ณด๋จ ์ปดํจํ ์ ์ฌ๊ณ ๊ฐ ์ค์ํ๋ค.
ํจ์๋ ์ง๋ ์๊ฐ์ ์ด์ผ๊ธฐํ๋ฏ์ด 2๊ฐ์ง์ ํํ๋ฅผ ๋๋ค
- ์์ ํจ์๋ก์จ์ ํจ์
- ๊ฐ์ฒด ๋ด๋ถ์ ํจ์์ธ ๋ฉ์๋
์ด 2๊ฐ์ง ํํ์ this๋ฅผ ํ์ ํด๋ณด์.
๋จผ์
ํจ์ ๋ด๋ถ์์์ this
๊ฒฐ๋ก ์ ๋จผ์ ์ด์ผ๊ธฐ ํ๋ค๋ฉด ํจ์๋ฅผ ํธ์ถํ ๋๋ this๊ฐ ์ง์ ์ด ๋์ง ์๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ์๋ค๊ณ ์ด์ผ๊ธฐ ํ์๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์์ฑํ๋ ๊ฐ๋จํ ์ฝ๋์กฐ์ฐจ๋ ๊ฐ์ฒด ์์์ ๋์๊ฐ๊ฒ ๋๋ค.
์ ๋ง ๊ฐ๋จํ ์ฝ๋๋ฅผ ๋ด๋ณด์.
let a = 10;
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด ์ ์ดํด๋ฅผ ํ๊ณ ์๊ฑฐ๋, ๋ด ๊ธ์ ์ ๋ฐ๋ผ์จ ์ฌ๋๋ค์ ๋ฐ๋ก ์ ์ ์๋ ์ง๋ฌธ์ ํ๋ ํด๋ณด์๋ฉด
์ฌ๊ธฐ์ ๋งํ๋ ๊ฐ์ฒด๊ฐ ๋ฌด์์ผ๊น์?
์ ๋ต์ด๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ๊ฐ์ฒด๋ window๊ฐ์ฒด๋ฅผ ๋ปํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ a
๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ window.a
๋ global.a
(node ํ๊ฒฝ)๋ก ํธ์ถํ ์ ์๋๋ฐ, ์ด๋ ๋ชจ๋ ๋ค ๊ฐ๋ค๊ณ ํ๋ค.
๊ทธ๋ผ
function a() { }
๋ ์ด๋จ๊น?
๋น์ฐํ window.a
๋ global.a
(node ํ๊ฒฝ)๋ก ํธ์ถํ ์ ์๋ค๋ ๋ง์ด๋ค.
๊ทธ๋ผ ์ฒ์์ ์ด์ผ๊ธฐ ํ๋ฏ์ด, this๊ฐ ์ง์ ์ด ๋์ง ์์ผ๋ฉด?? ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค๋ผ๊ณ ํ์ผ๋ ํจ์์์์ this๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ด์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ด๋ค.
๋ฉ์๋๋ก์จ์ ํจ์์ this
๋ฉ์๋ ๋ด๋ถ์์ ์ ์ํ๊ณ ์คํํ ํจ์๋ ์ง๋ ๊ธ์ ์ ์ดํดํ๋ค๋ฉด ๋ฐ๋ก ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
๋ฉ์๋๋ก์จ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋ง
console.log(Obj.method())
ํํ๋ก ํธ์ถ์ ํ๊ฒ ๋๋ค.
๊ทธ๋ผ method์์ ๋งํ๋ this๋ Obj๋ผ๋ ๊ฐ์ฒด๊ฐ ๋๋ค.
๊ทธ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ .
์ฐ์ฐ์๋ฅผ ๋ง๋๋ฉด ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ๋ป์ด๋ ๊ฐ์ฒด ์์ฒด๊ฐ ํ๋์ ์คํ ๋ฌธ๋งฅ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
var obj = {
outer : function() {
console.log(this);
}
}
console.log(obj.outer);
๊ทธ๋ผ ์ฌ๊ธฐ์๋ ์ถ๋ ฅ์ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋ ๊น?
๊ทธ๋ ๋ค. ๋ฐ๋ก obj
๊ฐ ๋๋ค.
๊ทธ๋ผ
outer: function () {
console.log(this);
var innerFunc = function () {
console.log(this);
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
}
obj.outer();
์ ๊ฒฐ๊ณผ๋
- obj1 window obj2.innerMethod
- window window obj2.innerMethod
- window window window
๋ฌด์์ผ๊น?
๊ทธ๋ ๋ค
๋ฐ๋ก obj1 window obj2.innerMethod
๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ์ง๋ง ๋ฌธ์ ๊ฐ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ ๋๋ ์ ๊ธฐ์ ์กด์ฌํ๋ ๋ชจ๋ this๋ ํ๋์ this๋ง ๊ฐ๋ฆฌํค๊ธธ ์ํ๋ค.
๊ฐ๋ฐํ ๋, ํ๋์ ๋ธ๋ก ์ค์ฝฎ์์ ์ด๋ค this๋ window๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ด๋ค this๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ฉด ํด๋น ์ฝ๋๋ ์๋์ ์ผ๋ก ๋์๊ฐ์ง ์์ ์ํฉ์ด ๋ฐ์ํ๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ this๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
ํ์ง๋ง ์์ฝ๊ฒ๋ ํ์ฌ๊น์ง this๋ฅผ ์ฐํํ๋ ์์ฒด ๊ธฐ๋ฅ์ ์๋ค. (๊ทน์ ์ธ ์ฐ์ถ์ ์ํ ๋ฐ๊ทธ๋ฆผ...์ฌ์ค Ecmascript5๊น์ง ์์๋๋ฐ 6์ ์๊ฒผ์ด์..)
๊ทธ๋ ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ณ์๋ฅผ ํ์ฉํ๋ค๋ฉด ๊ฐ๋จํ๊ฒ ์ ์ด์ํ ์ํฉ์ ์ฐํํ ์ ์๋ค.
๋ฐ๋ก log๋ฅผ ์ฐ์ ๋ this๋ก ์ฐ๋ ๊ฒ์ด ์๋๋ผ ํ๋์ this๋ฅผ ๋ณ์๋ก ๋ง๋ค๊ณ ๋ชจ๋ ๊ทธ ๋ณ์๋ฅผ ์ถ๋ ฅํ๊ฒ ํ๋ฉด ๋๋ค.
var obj = {
outer: function () {
console.log(this);
var innerFunc = function () {
console.log(this);
}
innerFunc();
var self = this;
var innerFunc2 = function () {
console.log(self);
}
}
}
obj.outer();
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
this๋ฅผ ์ฐํํ๋ ์๋ก์ด ๋ฐฉ๋ฒ (ํ์ดํ ํจ์์ ๋ฑ!์ฅ!)
this๋ฅผ ์ฐํํ๊ธฐ ์ํด์ ๋ณ์๋ฅผ ์จ์ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ด๋ฐ ๊ณผ์ ๋ค์ด ๋ถํ์ํ๋ค๋ ๊ฒ์ ๋๋ Ecmascript6 ์ค๊ณ์๋ค์ ์์ this ๋ฐ์ธ๋ฉ์ ํ์ง ์๋ ํจ์๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก ๊ทธ ์ ๋ช ํ
ํ์ดํ ํจ์์ด๋ค.
ํ์ดํ ํจ์๋ LexicalEnvironment์์ thisBinding๊ณผ์ ์์ฒด๊ฐ ์๋ต๋์ด ์์ ์ค์ฝํ์ this๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
๊ทธ๋์ ์์ ์ฝ๋๋ฅผ ๊ฐ๋จํ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์ ์ฌ๊ตฌ์ฑํ๋ค๋ฉด
var obj = {
outer: function () {
console.log(this);
var innerFunc = () => {
console.log(this);
}
innerFunc();
}
}
obj.outer();
๊ฐ๋จํ๊ฒ this๋ฅผ ์ฐ๊ฒฐ์ํฌ ์ ์๋ค.
์ด๋ฐ ๋ฐฉ๋ฒ ์ค์๋ apply()
๋ call()
๋ฑ์ด ์๋๋ฐ, ๊ทธ ๋ถ๋ถ์ ๋ค์์ ํ์ธํด๋ณด๋๋ก ํ์.
๋๊ธ