๐ก ์คํ ์ปจํ ์คํธ๋ ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
- ๊ทธ ๊ฐ์ฒด ์์๋ 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
โ VariableEnvironment
โ LexicalEnvironment
โ ThisBindings
this๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ค.
- ์ ์ญ ๊ณต๊ฐ์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด
- ๋ฐํ์ ํ๊ฒฝ์ ๋ฐ๋ผ this๋ window(๋ธ๋ผ์ฐ์ ํ๊ฒฝ) ๋๋ global(node ํ๊ฒฝ)๋ฅผ ๊ฐ๊ฐ ๊ฐ๋ฆฌํด -> (๊ฐ๋ฐ์๋๊ตฌ -> ์ฝ์์์ ํ์ธ)
// <๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ this ํ์ธ)
console.log(this);
console.log(window);
console.log(this === window);
// <node ํ๊ฒฝ this ํ์ธ>
console.log(this);
console.log(global);
console.log(this === global);
ํจ์
๋ ๊ทธ ์์ฒด๋ก ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ ์ํ -> ์ ์ญ๊ฐ์ฒดํจ์๋ช ();
๋งค์๋
๋ ์์ ์ ํธ์ถํ ๋์ ๊ฐ์ฒด์ ๋ํ ๋์์ ์ํ -> ํธ์ถ์ ์ฃผ์ฒด๊ฐ ์์๊ฐ์ฒด. ๋ฉ์๋๋ช ()
// CASE1 : ํจ์
// ํธ์ถ ์ฃผ์ฒด๋ฅผ ๋ช
์ํ ์ ์๊ธฐ ๋๋ฌธ์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
var func = function (x) {
console.log(this, x);
};
func(1); // Window { ... } 1
//obj1.func() ์ด๋ฐ์์ผ๋ก ํธ์ถ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ window ๊ฐ์ฒด ์ผ ์ ๋ฐ์ ์์
----------------------------------------------------------------------
// CASE2 : ๋ฉ์๋
// ํธ์ถ ์ฃผ์ฒด๋ฅผ ๋ช
์ํ ์ ์๊ธฐ ๋๋ฌธ์ this๋ ํด๋น ๊ฐ์ฒด(obj)๋ฅผ ์๋ฏธ
// obj๋ ๊ณง { method: f }
var obj = {
method: func,
};
obj.method(2); // { method: f } 2
์ (.) , ๋๊ดํธ ([])
var obj = {
method: function (x) { console.log(this, x) }
};
obj.method(1); // { method: f } 1
obj['method'](2); // { method: f } 2
this๋
ํธ์ถ์ ๋๊ฐ ํ๋์ง์ ๋ํ ์ ๋ณด
๊ฐ ๋ด๊ธด๋ค
var obj = {
methodA: function () { console.log(this) },
inner: {
methodB: function() { console.log(this) },
}
};
obj.methodA(); // this === obj
obj['methodA'](); // this === obj
obj.inner.methodB(); // this === obj.inner
obj.inner['methodB'](); // this === obj.inner
obj['inner'].methodB(); // this === obj.inner
obj['inner']['methodB'](); // this === obj.inner
this๋ ํญ์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค
var obj1 = {
outer: function() {
console.log(this); // (1) obj1
var innerFunc = function() {
console.log(this); // (2) ์ ์ญ๊ฐ์ฒด, (3) obj2
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
this ๋ฐ์ธ๋ฉ์ ๊ดํด์๋ ์ค์ง ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ ์์ ์ ๋๋ ๋๊ดํธ ํ๊ธฐ๊ฐ ์๋์ง๊ฐ ๊ด๊ฑด
var obj1 = {
outer: function() {
console.log(this); // (1) outer
// AS-IS
var innerFunc1 = function() {
console.log(this); // (2) ์ ์ญ๊ฐ์ฒด
}
innerFunc1();
// TO-BE
var self = this;
var innerFunc2 = function() {
console.log(self); // (3) outer
};
innerFunc2();
}
};
// ๋ฉ์๋ ํธ์ถ ๋ถ๋ถ
obj1.outer();
var obj = {
outer: function() {
console.log(this); // (1) obj
var innerFunc = () => {
console.log(this); // (2) obj
};
innerFunc();
}
}
obj.outer();
์ฝ๋ฐฑํจ์: ์ด๋ ํ ํจ์, ๋ฉ์๋์ ์ธ์(๋งค๊ฐ๋ณ์)๋ก ๋๊ฒจ์ฃผ๋ ํจ์
// ๋ณ๋ ์ง์ ์์ : ์ ์ญ๊ฐ์ฒด
setTimeout(function () { console.log(this) }, 300);
// ๋ณ๋ ์ง์ ์์ : ์ ์ญ๊ฐ์ฒด
[1, 2, 3, 4, 5].forEach(function(x) {
console.log(this, x);
});
// addListener ์์์์ this๋ ํญ์ ํธ์ถํ ์ฃผ์ฒด์ element๋ฅผ returnํ๋๋ก ์ค๊ณ๋์์
// ๋ฐ๋ผ์ this๋ button์ ์๋ฏธํจ
document.body.innerHTML += '<button id="a">ํด๋ฆญ</button>';
document.body.querySelector('#a').addEventListener('click', function(e) {
console.log(this, e);
});
window ๊ฐ์ฒด
addEventListner์ ์๋ถ๋ถ