- ๋ค๋ฅธ ๋๋ถ๋ถ์ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ this๋ ํด๋์ค๋ก ์์ฑํ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์๋ฏธ.
- ๊ทธ๋ฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ์ํฉ์๋ฐ๋ผ ๊ฐ๋ฆฌํค๋ ๋์์ด ๋ฌ๋ผ์ง๋ค.
- ํจ์์ ๊ฐ์ฒด์ ๊ตฌ๋ถ์ด ์๋งคํ ์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ์ด๋์ ๊ตฌ๋ถํ๋ ์ ์ผํ ์๋จ์ด ๋๋ค.
- this๋ ์คํ์ปจํ ์คํธ ์์ฑ์ ๋ฐ์ธ๋ฉ๋๋ค.
1-1. ์ ์ญ ๊ณต๊ฐ์์์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.(๋ธ๋ผ์ฐ์ ์์๋ window,Node.js์์๋ global ์ฐธ์กฐ)
1-2. ์ด๋ค ํจ์๋ฅผ ๋ฉ์๋๋ก์ ํธ์ถํ ๊ฒฝ์ฐ this๋ ๋ฉ์๋ ํธ์ถ ์ฃผ์ฒด(๋ฉ์๋๋ช ์์ ๊ฐ์ฒด)๋ฅผ ์ฐธ์กฐํ๋ค.(๋ฉ์๋๋ก์์ ํธ์ถ์ด๋,ํจ์๋ฅผ .ํ๊ธฐ๋ฒ,๋๊ดํธ ํ๊ธฐ๋ฒ์ผ๋ก ํธ์ถ์ ํ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.)
1-3. ์ด๋ค ํจ์๋ฅผ ํจ์๋ก์ ํธ์ถํ ๊ฒฝ์ฐ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค. (๋ฉ์๋ ๋ด์์ ์ ์ํ ํจ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ๋ ๋์ผํ๋ค.)
1-4. ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this๋ ํด๋น ์ฝ๋ฐฑ ํจ์์ ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ํจ์๊ฐ ์ ์ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉฐ, ์ ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
1-5. ์์ฑ์ ํจ์์์์ this๋ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค.
2. ๋ช ์์ this ๋ฐ์ธ๋ฉ( ์ ๊ท์น์ ๋ถํฉํ์ง ์๋ ๊ฒฝ์ฐ์ ์๋ ๋ด์ฉ์ผ๋ก this๋ฅผ ์์ธก ํ ์ ์๋ค.)
2.1 call,apply ๋ฉ์๋๋ this๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ฉด์ ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
2.2 bind๋ฉ์๋๋ this ๋ฐ ํจ์์ ๋๊ธธ ์ธ์๋ฅผ ์ผ๋ถ ์ง์ ํด์ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ ๋ค.
2.3 ์์๋ฅผ ์ํํ๋ฉด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ ๋ด์ฉ์ ์ผ๋ถ ๋ฉ์๋๋ ๋ณ๋์ ์ธ์๋ก this๋ฅผ ๋ฐ๊ธฐ๋ ํ๋ค.
1.1 ์ ์ญ ๊ณต๊ฐ์์์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.(๋ธ๋ผ์ฐ์ ์์๋ window,Node.js์์๋ global ์ฐธ์กฐ)
console.log(this); // { alert: f(), atob: f(), blur: f(), btoa: f(), ... }
console.log(window); // { alert: f(), atob: f(), blur: f(), btoa: f(), ... }
console.log(this === window); // true
1-2. ์ด๋ค ํจ์๋ฅผ ๋ฉ์๋๋ก์ ํธ์ถํ ๊ฒฝ์ฐ this๋ ๋ฉ์๋ ํธ์ถ ์ฃผ์ฒด(๋ฉ์๋๋ช ์์ ๊ฐ์ฒด)๋ฅผ ์ฐธ์กฐํ๋ค.
1-3. ์ด๋ค ํจ์๋ฅผ ํจ์๋ก์ ํธ์ถํ ๊ฒฝ์ฐ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค. (๋ฉ์๋ ๋ด์์ ์ ์ํ ํจ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ๋ ๋์ผํ๋ค.)
- ๋ ๋ฆฝ์ฑ ์ฐจ์ด.
- ํจ์ : ๊ทธ ์ฐจ์ฒด๋ก ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ์ํ.
- ๋ฉ์๋ : ๋์ ๊ฐ์ฒด์ ๊ดํ ๋์์ ์ํ.
var func = function (x) {
// ์คํํ ํจ์ ์ ์.
console.log(this, x);
};
func(1); // Window { ... } 1
var obj = {
method: func,
};
obj.method(2); // { method: f } 2
obj["method"](2); // { method: f } 2
// ํจ์ ์์ ์ (.) or ๋๊ดํธ ํ๊ธฐ๋ฒ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ์ ๋ฉ์๋๋ก์ ํธ์ถํ๊ฒ
var obj1 = {
outer: function () {
console.log(this);
var innerFunc = function () {
console.log(this);
};
innerFunc(); // (2) ์์ ์๋ฌด๊ฒ๋์์์ผ๋ก window ์ถ๋ ฅ. (ํจ์๋ก ํธ์ถ)
var obj2 = {
innerMethod: innerFunc,
};
obj2.innerMethod(); // (3) ์์ (.)์ด ์กด์ฌํจ์ผ๋ก, this๋ก obj2๊ฐ์ถ๋ ฅ๋จ. (๋ฉ์๋๋ก์ ํธ์ถ)
},
};
obj1.outer(); // (1) ์์ (.)์ด ์กด์ฌํ์์ผ๋ก, this๋ก obj๊ฐ ์ถ๋ ฅ๋๋ค. ( ๋ฉ์๋๋ก์จ ํธ์ถ)
1-4. ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this๋ ํด๋น ์ฝ๋ฐฑ ํจ์์ ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ํจ์๊ฐ ์ ์ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉฐ, ์ ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
- ์ฝ๋ฐฑํจ์ : ํจ์ A์ ์ ์ด๊ถ์ ๋ค๋ฅธํจ์(๋๋ ๋ฉ์๋) B์๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒฝ์ฐ ํจ์A๋ฅผ ์ฝ๋ฐฑ ํจ์๋ผ ํ๋ค.
setTimeout(function () {
console.log(this);
}, 300); // (1)
[1, 2, 3, 4, 5].forEach(function (x) {
// (2)
console.log(this, x);
});
document.body.innerHTML += '<button id="a">ํด๋ฆญ</button>';
document.body.querySelector("#a").addEventListener("click", function (e) {
// (3)
console.log(this, e); // <button id="a">ํด๋ฆญ</button>
});
// function(e) {...} ํจ์์ ์ ์ด๊ถ์ ๋ค๋ฅธํจ์ addEventListener์๊ฒ ๋๊ฒจ์ค.
// function(e) {...} ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ผํ๋ค.
// addEventListener ๋ฉ์๋๋ ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ ๋ ์์ ์ this๋ฅผ ์์ํ๋๋ก ์ ์๋์ด์๋ค.
// ๋ฐ๋ผ์ ์ฝ๋ฐฑํจ์ ๋ด๋ถ์์์ this๋ <button id="a">ํด๋ฆญ</button>.
- ์ฝ๋ฐฑํจ์ ๋ด์์ this๋ฅผ ์ ํํ๊ฒ ์ ์ ํ ์ ์๋ค.
- ์ฝ๋ฐฑํจ์์ ์ ์ด๊ถ์ ๊ฐ์ง ํจ์๊ฐ ์ฝ๋ฐฑ ํจ์์์์ this๋ฅผ ๋ฌด์์ผ๋ก ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ํน๋ณํ ์ ์ํ์ง์๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์์ ์์ฑ์๋ก์์ ์ญํ ์ ํจ๊ป๋ถ์ฌํจ.
- ๋ฐ๋ผ์ ํจ์์์ new๋ช ๋ น์ด์ ํจ๊ผ ํธ์ถ์ ์์ฑ์๋ก์จ ๋์ํ๊ฒ๋์ด์๋ค. (ํด๋์ค๋ก์จ ๋์)
- ์ด๋ค ํจ์๊ฐ ์์ฑ์ ํจ์๋ก์จ ํธ์ถ๋๊ฒฝ์ฐ, ํจ์ ๋ด๋ถ์์์ this๋ ์๋ก๋ง๋ค์ด์ง ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๊ณตํต๋ ์ฑ์ง์ ์ง๋ ๊ฐ์ฒด๋ค์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์.
- ๊ฐ์ฒด ์งํฅ ์ธ์ด์์๋ ์์์๋ฅผ ํด๋์ค, ํด๋์ค๋ฅผ ํตํด ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
- ์์ฑ์๋ ์ธ์คํดํธ๋ฅผ ๋ง๋ค๊ธฐ์ํ 'ํ'.
var Cat = function (name, age) {
this.bark = "์ผ์น";
this.name = name;
this.age = age;
};
var choco = new Cat("์ด์ฝ", 7);
var nabi = new Cat("๋๋น", 5);
console.log(choco, nabi);
/* ๊ฒฐ๊ณผ
Cat { bark: '์ผ์น', name: '์ด์ฝ', age: 7 }.
Cat { bark: '์ผ์น', name: '๋๋น', age: 5 }
*/
// ์ถ๋ ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์๋, choco,nabi์ ํ ๋น๋๋ ๊ฐ์ ๋ง๋ค๊ธฐ์ํด ํธ์ถ๋ ์์ฑ์ํจ์ ๋ด๋ถ์์์ this๋ ๊ฐ๊ฐ choco, nabi๋ฅผ ๊ฐ๋ฆฌ์ผฐ์์ ์ ์ ์๋ค.
2.1 call,apply ๋ฉ์๋๋ this๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ฉด์ ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- call๋ฉ์๋๋ call๋ฉ์๋์ ํธ์ถ ์ฃผ์ต๋ฅผ ์ฆ์ ์คํ์ํจ๋ค.
- ์ฒซ๋ฒ์งธ ์ธ์๋ก๋ this๋ก ์ค์ ํ ๋์๋ฅผ ์ ๋ฌํ๋ค. (์ฒซ๋ฒ์จฐ ์ธ์๋ฅผ this๋ก ๋ฐ์ธ๋ฉํ๋ค)
- ๋๋ฒ์จฐ ์ธ์๋ก๋ ํธ์ถํ ํจ์๋ก ์ ๋ฌ๋๋ ์ธ์๋ก ๊ตฌ์ฑ๋๋ค.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
func(1, 2, 3); // Window{ ... } 1 2 3
func.call({ x: 1 }, 4, 5, 6); // { x: 1 } 4 5 6
- call ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์์ ๋์ผ.
- ํ๊ฐ์ง ์ฐจ์ด์ ์ผ๋ก๋ ํธ์ถํ ํจ์์๊ฒ ์ ๋ฌ๋๋ ์ธ์๋ค์ ๋ฐฐ์ด๋ก ๋ฐ๋๋ค.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6
var obj = {
a: 1,
method: function (x, y) {
console.log(this.a, x, y);
},
};
obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6
2.2 bind๋ฉ์๋๋ this์ง์ ๋ฐ ํจ์์ ๋๊ธธ ์ธ์๋ฅผ ์ผ๋ถ ์ง์ ํด์ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ ๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก call๊ณผ ๋น์ทํ์ง๋ง ์ฆ์ ํธ์ถํ์ง๋์๊ณ ๋๊ฒจ๋ฐ์ ๊ฐ๋ค์ ๋ฐํ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ ๋ฉ์๋.
var func = function (a, b, c, d) {
console.log(this, a, b, c, d);
};
func(1, 2, 3, 4); // Window{ ... } 1 2 3 4
var bindFunc1 = func.bind({ x: 1 }); // 1. ์๋ก์ด ํจ์ ์์ฑ.
bindFunc1(5, 6, 7, 8); // { x: 1 } 5 6 7 8
var bindFunc2 = func.bind({ x: 1 }, 4, 5); // 2. ๋ถ๋ถ์ ์ฉ ๊ตฌํ.
bindFunc2(6, 7); // { x: 1 } 4 5 6 7
bindFunc2(8, 9); // { x: 1 } 4 5 8 9
- bind๋ฉ์๋๋ฅผ ํ์ฉํด์ ๋ง๋ ํจ์์ name ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ์ค์ ๋๋ค.
- ์ด name ํ๋กํผํฐ๋ฅผํตํด ์ด๋ค ํจ์๋ก๋ถํฐ ๋ฐ์ธ๋ ๋์๋์ง ํ์ธํ ์ ์์ด call/apply๋ณด๋ค ์ฝ๋ ์ถ์ ์ด ์์ํด์ง๋ค.
var func = function (a, b, c, d) {
console.log(this, a, b, c, d);
};
var bindFunc = func.bind({ x: 1 }, 4, 5);
console.log(func.name); // func
console.log(bindFunc.name); // bound func
- ๋ด๋ถํจ์์ ์ ๋ฌํ๊ธฐ 1. call
var obj = {
outer: function () {
console.log(this); // 1. obj
var innerFunc = function () {
console.log(this); // 3. obj (call์ ์ ์ฉํ์ง์์๋ค๋ฉด, window๊ฐ ์ถ๋ ฅ๋๋ค.)
};
innerFunc.call(this); // 2. this์ obj์ ๋ฌ
},
};
obj.outer(); // ์คํ
- ๋ด๋ถํจ์์ ์ ๋ฌํ๊ธฐ 2. bind
var obj = {
outer: function () {
console.log(this); // 1. obj
var innerFunc = function () {
console.log(this); // 4. obj (bind๋ฅผ ์ ์ฉํ์ง์์๋ค๋ฉด, window๊ฐ ์ถ๋ ฅ๋๋ค.)
}.bind(this); // 2. obj๋ฅผ ๋ฐ์ธ๋ฉํ ํจ์ ์์ฑ.
innerFunc(); // 3. ์คํ
},
};
obj.outer(); // ์คํ
- ์คํ์ปจํ ์คํธ ์์ฑ ์ this๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ ์ด ์ ์ธ๋๋ค.
- ์ฆ ์ด ํจ์ ๋ด๋ถ์๋ this์์ฒด๊ฐ ์์ ์์ผ๋ฉฐ, ์ ๊ทผ์ ํ๊ฒ๋ ์ ์ค์ฝํ์ฒด์ธ์ ๊ฐ์ฅ ๊ฐ๊น์ด this์ ์ ๊ทผํ๊ฒ๋๋ค.(์์์ค์ฝํ๊ฐ์๋ ์์์ค์ฝํ์ ๋ฐ์ธ๋ฉ๋ this)
var obj = {
outer: function () {
console.log(this); // obj
var innerFunc = () => {
console.log(this); // obj
};
innerFunc();
},
};
obj.outer(); // ์คํ
2.3 ์์๋ฅผ ์ํํ๋ฉด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ ๋ด์ฉ์ ์ผ๋ถ ๋ฉ์๋๋ ๋ณ๋์ ์ธ์๋ก this๋ฅผ ๋ฐ๊ธฐ๋ ํ๋ค.
var report = {
sum: 0,
count: 0,
add: function () {
var args = Array.prototype.slice.call(arguments);
args.forEach(function (entry) {
this.sum += entry;
++this.count;
}, this); // ๋ณ๋์ ์ธ์๋ก this๋ฅผ ๋ฐ๋๋ค. (์ง๊ธ์ํ์์ report ๋ฐ๋ผ๋ด)
},
average: function () {
return this.sum / this.count;
},
};
report.add(60, 85, 95); // ์์ (.)์ด ์กด์ฌํจ์ผ๋ก, this๋ก report์ค์ .
console.log(report.sum, report.count, report.average()); // 240 3 80
- ์ forEachํจ์์๊ฐ์ด ์์๋ฅผ ์ํํ๋ฉด์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ๋ณตํธ์ถํ๊ณ this๋ฅผ ๋ณ๋์ ์ธ์๋ก ๋ฐ๋ ํจ์๋ชฉ๋ก.
Array.prototype.forEach(callback[, thisArg])
Array.prototype.map(callback[, thisArg])
Array.prototype.filter(callback[, thisArg])
Array.prototype.some(callback[, thisArg])
Array.prototype.every(callback[, thisArg])
Array.prototype.find(callback[, thisArg])
Array.prototype.findIndex(callback[, thisArg])
Array.prototype.flatMap(callback[, thisArg])
Array.prototype.from(arrayLike[, callback[, thisArg]])
Set.prototype.forEach(callback[, thisArg])
Map.prototype.forEach(callback[, thisArg])
- ํจ์์ ํธ์ถ ์ฃผ์ต๋ฅผ ์ง์ ํ๋๊ฒ์ this๋ฐ์ธ๋ฉ์ด๋ผ ํ๋ค.
- ํธ์ถ ์ฃผ์ต๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ํจ์๋ฅผ ๋จ๋ ์ผ๋ก ํธ์ถํ๋,๊ฐ์ฒด์ ๋ฉ์๋๋ก์จ ํธ์ถํ๋์ ์ฐจ์ด์์ ๋ฐ์ํ๋ค. (์์ 2-1-3 ํจ์ vs ๋ฉ์๋์์ ์์์ฝ๋ํ์ธ)
- ํจ์์ ์คํ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ ๋ฐ์ํ๋ค.
- this๋ฅผ ์๋์ ์ผ๋ก ๋ณ๊ฒฝ์ํฌ์์๋ค. call,apply,bind๋ฉ์๋๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ.(์ด๊ฐ์๊ฒฝ์ฐ์ ํธ์ถ์ฃผ์ต์๋ ์๊ด์ด ์๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ์ ์ํฌ ์ ์๋ค.)
- ํ์ดํํจ์๋ก ํจ์๋ฅผ ์ ์ํ๊ฒ๋๋ฉด. ์คํ์ปจํ ์คํธ๋จ๊ณ์์ this๋ฐ์ธ๋ฉ ๊ณผ์ ์ด ์ ์ธ๋๋ค. ๋ฐ๋ผ์ ํ์ดํํจ์ ์์์์ this๋ ์์ ์คํ์ปจํ ์คํธ์์ ์ ์๋ this๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ค.
- ์ฝ๋ฐฑํจ์๋ก์จ(์ธ์๋ก์จ) ํจ์๋ฅผ ์ ๋ฌํ๊ฒ๋๋ฉด. ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์์๊ฒ ํจ์์ ์คํ์๋ํ ๊ถํ์ด ์์๋์ด ์ฝ๋ฐฑํจ์๋ด์์์ this๋ํ ์ ๋ฌ๋ฐ์ ํจ์์์ํด ์ง์ ์ด ๊ฐ๋ฅํด์ง๋ค.