๐ก ์คํ ์ปจํ ์คํธ๋ ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด์ด๋ค.
- ์คํ ์ปจํ ์คํธ ๊ฐ์ฒด ์์๋ 3๊ฐ์ง๊ฐ ์กด์ฌ
- VariableEnvironment
- LexicalEnvironment
- ๐ ThisBindings
๋ค๋ฅธ ๊ฐ์ฒด์งํฅ ์ธ์ด์์์ this๋ ๊ณง ํด๋์ค๋ก ์์ฑํ ์ธ์คํด์ค๋ฅผ ๋งํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ this๊ฐ ์ด๋์์๋ ์ฌ์ฉ๋ ์ ์๋ค.
this๊ฐ ์ํฉ๋ณ๋ก ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋์ง, ์ด์ ๋ ๋ญ์ง, this๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์์๋ณด์.
์ด ๋ง์ this๋ฅผ bindํ๋ค(=๋ฌถ๋๋ค) ๋ผ๊ณ ๋ ํ๋ค.
๋ค์ ๋งํ๋ฉด. this๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ค. ๋ผ๊ณ ํ ์ ์๋ค.
1. ์ ์ญ ๊ณต๊ฐ์์์ this
1. ์ ์ญ ๊ณต๊ฐ์์ this๋ **์ ์ญ ๊ฐ์ฒด**๋ฅผ ๊ฐ๋ฆฌ์ผ์.
2. ๋ฐํ์ ํ๊ฒฝ์ ๋ฐ๋ผ this๋ window(๋ธ๋ผ์ฐ์ ํ๊ฒฝ) ๋๋ global(node ํ๊ฒฝ)๋ฅผ ๊ฐ๊ฐ ๊ฐ๋ฆฌํต๋๋ค.
<aside>
๐ก **๋ฐํ์ ํ๊ฒฝ?**
์ฌ๋ฌ๋ถ๋ค์ด javascript๋ก ๋ง๋ค์ด๋์ ํ๋ก๊ทธ๋จ์ด ๊ตฌ๋์ค์ธ ํ๊ฒฝ์ ๋งํ์ฃ . ์ฐ๋ฆฌ๋ node ํ์ผ์ด๋ฆ.js๋ก vscode ์์์ ๊ตฌ๋ํ๊ณ ์์ผ๋ **node ํ๊ฒฝ**์ด๋ผ๊ณ ํ ์ ์๊ตฌ์. html ํ์ผ ์์ ์จ๊ฒจ๋์์ ํฌ๋กฌ๋ธ๋ผ์ฐ์ ๋ฑ์์ ์ฐ๋ค๊ณ ํ๋ค๋ฉด **๋ธ๋ผ์ฐ์ ํ๊ฒฝ**์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค์.
</aside>
<๋ธ๋ผ์ฐ์ ํ๊ฒฝ this ํ์ธ>
```jsx
console.log(this);
console.log(window);
console.log(this === window);
```
<node ํ๊ฒฝ this ํ์ธ>
```jsx
console.log(this);
console.log(global);
console.log(this === global);
```
ํจ์์ ๋ฉ์๋๋ ์๋นํ ๋น์ทํด ๋ณด์ด์ง๋ง ์ฐจ์ด๊ฐ ์๋ค.
๊ธฐ์ค์ ๋
๋ฆฝ์ฑ์ด๋ค.
ํจ์๋ช
();
๊ฐ์ฒด.๋ฉ์๋๋ช
();
// CASE1 : ํจ์
// ํธ์ถ ์ฃผ์ฒด๋ฅผ ๋ช
์ํ ์ ์๊ธฐ ๋๋ฌธ์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์๋ฏธํด์.
var func = function (x) {
console.log(this, x);
};
func(1); // Window { ... } 1
// 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๋ ์ง์ ๋์ง ์์
(ํธ์ถ ์ฃผ์ฒด๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ)
์คํ์ปจํ
์คํธ๋ฅผ ํ์ฑํํ ๋น์ this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ,
this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
๋ฐ๋ผ์, ํจ์๋ก์ โ๋
๋ฆฝ์ ์ผ๋กโ ํธ์ถํ ๋๋ this๋ ํญ์ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ ๊ฒ์ ์ฃผ์!
this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์๋ฏธvar obj1 = {
outer: function() {
console.log(this); // (1)
var innerFunc = function() {
console.log(this); // (2), (3)
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
(1) : obj1
(2) : ์ ์ญ๊ฐ์ฒด
(3) : obj2
โ this ๋ฐ์ธ๋ฉ์ ๊ดํด์๋ ํจ์๋ฅผ ์คํํ๋ ๋น์์ ์ฃผ๋ณ ํ๊ฒฝ(๋ฉ์๋ ๋ด๋ถ์ธ์ง, ํจ์ ๋ด๋ถ์ธ์ง)์ ์ค์ํ์ง ์๊ณ ,
์ค์ง ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ ์์ ์ ๋๋ ๋๊ดํธ ํ๊ธฐ๊ฐ ์๋์ง๊ฐ ๊ด๊ฑด์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
this์ ๋ํด์ ์ดํด๋ ํ๊ฒ ์ง๋งโฆ ์ฌ์ฉ์ ์ ์ฅ์์ ์ฆ, ๊ฐ๋ฐ์ ์ ์ฅ์์ ์ด๊ฒ ์ฝ๊ฒ ๋ฐ์๋ค์ฌ์ง์ง ์๋๋ค ใ ใ
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐ๋ฆฌ๋ ์ฐพ์๋ณผ ์ ์๋ค!
๋ด๋ถ ์ค์ฝํ์ ์ด๋ฏธ ์กด์ฌํ๋ this๋ฅผ ๋ณ๋์ ๋ณ์(ex : self)์ ํ ๋นํ๋ ๋ฐฉ๋ฒ
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();
ES6์์๋ ํจ์ ๋ด๋ถ์์ this๊ฐ ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋ฌธ์ ๋๋ฌธ์ ํ์ดํํจ์๋ฅผ ๋์ ํ๋ค.
Q. ์ผ๋ฐ ํจ์์ ํ์ดํ ํจ์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์?
A. ๐ this binding ์ฌ๋ถ
var obj = {
outer: function() {
console.log(this); // (1) obj
var innerFunc = () => {
console.log(this); // (2) obj
};
innerFunc();
}
}
obj.outer();
์ฝ๋ฐฑํจ์๋ โ์ด๋ ํ ํจ์, ๋ฉ์๋์ ์ธ์(๋งค๊ฐ๋ณ์)๋ก ๋๊ฒจ์ฃผ๋ ํจ์โ์ด๋ค.
์ด ๋, ์ฝ๋ฐฑํจ์ ๋ด๋ถ์ this๋ ํด๋น ์ฝ๋ฐฑํจ์๋ฅผ ๋๊ฒจ๋ฐ์ ํจ์(๋ฉ์๋)๊ฐ ์ ํ ๊ท์น์ ๋ฐ๋ผ ๊ฐ์ด ๊ฒฐ์ ๋๋ค.
this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(ํธ์ถ ์ฃผ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ)์์ธ์ ์ผ๋ก ๊ทธ ๋์์ ์ฐธ์กฐโ ๋ก์ง์ ์ดํดํ๋ ๊ฒ ๋ณด๋ค๋, this์ ์ํ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ๋ ์ค์!
// โ
๋ณ๋ ์ง์ ์์ : ์ ์ญ๊ฐ์ฒด
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);
});
setTimeout ํจ์, forEach ๋ฉ์๋๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ ๋ ๋์์ด ๋ this๋ฅผ ์ง์ ํ์ง ์์ผ๋ฏ๋ก, this๋ ๊ณง window๊ฐ์ฒด
addEventListner ๋ฉ์๋๋ ์ฝ๋ฐฑ ํจ์ ํธ์ถ ์, ์์ ์ this๋ฅผ ์์ํ๋ฏ๋ก, this๋ addEventListner์ ์๋ถ๋ถ(button ํ๊ทธ)
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์์ ์์ฑ์ ํจ์ ๋ด๋ถ์์์ this๋ฅผ ๋ณธ ์ ์ด ์์!
var Cat = function (name, age) {
this.bark = '์ผ์น';
this.name = name;
this.age = age;
};
var choco = new Cat('์ด์ฝ', 7); //this : choco ์ธ์คํด์ค ๊ฐ๋ฆฌํด
var nabi = new Cat('๋๋น', 5); //this : nabi ์ธ์คํด์ค ๊ฐ๋ฆฌํด
์๋์ผ๋ก ๋ถ์ฌ๋๋ ์ํฉ๋ณ this์ ๊ท์น์ ๊นจ๊ณ this์ ๋ณ๋์ ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
ํฌ๊ฒ, call / apply / bind๋ฉ์๋๋ก ๋ช
์์ this ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
ํธ์ถ ์ฃผ์ฒด์ธ ํจ์๋ฅผ ์ฆ์ ์คํํ๋ ๋ช ๋ น์ด
call ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ, ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ this๋ก bindingํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ช ์์ ์ผ๋ก bindingํ ์ ์.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
// no binding
func(1, 2, 3); // Window{ ... } 1 2 3
// ๋ช
์์ binding
// func ์์ this์๋ {x: 1}์ด binding๋ผ์
func.call({ 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(2, 3); // 1 2 3
obj.method.call({ a: 4 }, 5, 6); // 4 5 6
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
๋ฌผ๋ก this binding์ ์ํด call, apply method๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง ๋ ์ ์ฉํ ์ธก๋ฉด๋ ์๋ค.
๊ฐ์ฒด์ด์ง๋ง ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๋ฐฐ์ด์ ์๋ฏธํ๋ค.
1. ๋ฐ๋์ length๊ฐ ํ์ํ๋ค. ์ด ์กฐ๊ฑด์ ํ์๋ก, ์ด ์กฐ๊ฑด์ด ์์ผ๋ฉด ์ ์ฌ๋ฐฐ์ด์ด๋ผ๊ณ ์ธ์ํ์ง ์๋๋ค.
2. index ๋ฒํธ๊ฐ 0๋ถํฐ ์์ํด์ 1 ์ฉ ์ฆ๊ฐํด์ผ ํ๋ค. ์ด ์กฐ๊ฑด์ ํ์๋ ์๋์ง๋ง, ๊ทธ๋ ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
slice() ๋ฉ์๋๋ ๋ฐฐ์ด๋ก ๋ถํฐ ํน์ ๋ฒ์๋ฅผ ๋ณต์ฌํ ๊ฐ๋ค์ ๋ด๊ณ ์๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ์์ ์ธ๋ฑ์ค, ๋ ๋ฒ์งธ ์ธ์๋ก ์ข
๋ฃ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๊ณ , ์์ ์ธ๋ฑ์ค ๋ถํฐ ์ข
๋ฃ ์ธ๋ฑ์ค๊น์ง์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
//๊ฐ์ฒด์๋ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ง์ ์ ์ฉํ ์ ์์ด์.
//์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์๋ call ๋๋ apply ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฐจ์ฉํ ์ ์์ด์.
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
Array.prototype.push.call(obj, 'd');
console.log(obj); // { 0: 'a', 1: 'b', 2: 'c', 3: 'd', length: 4 }
var arr = Array.prototype.slice.call(obj);
console.log(arr); // [ 'a', 'b', 'c', 'd' ]
์ฌ์ค, call/apply๋ฅผ ํตํด this binding์ ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด โ ๋ฐฐ์ด๋ก์ ํ ๋ณํ ๋ง์ ์ํด์๋ ์ธ ์ ์์ง๋ง ์๋ ์๋์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๋ฐฉ๋ฒ์ด๋ผ ํ ์ ์๋ค.
๋ฐ๋ผ์, ES6์์๋ Array.from์ด๋ผ๋ ๋ฐฉ๋ฒ์ด ๋์๋ค.
// ์ ์ฌ๋ฐฐ์ด
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
// ๊ฐ์ฒด -> ๋ฐฐ์ด
var arr = Array.from(obj);
// ์ฐ์ด๋ณด๋ฉด ๋ฐฐ์ด์ด ์ถ๋ ฅ๋ฉ๋๋ค.
console.log(arr);
Student, Employee ๋ชจ๋ Person์ด๋ค.
name๊ณผ gender ์์ฑ ๋ชจ๋ ํ์ํ๋ค.
๊ทธ๋ฌ๋ Student์ Employee ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ๋ง๋ค ์ธ ๊ฐ์ง ์์ฑ์ ๋ชจ๋ ๊ฐ ์์ฑ์ ํจ์์ ๋ฃ๊ธฐ ๋ณด๋ค๋ Person์ด๋ผ๋ ์์ฑ์ ํจ์๋ฅผ ๋ณ๋๋ก ๋นผ๋๊ฒ โ๊ตฌ์กฐํโ์ ๋์์ด ๋๊ณ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
function Student(name, gender, school) {
Person.call(this, name, gender); // ์ฌ๊ธฐ์ this๋ student ์ธ์คํด์ค!
this.school = school;
}
function Employee(name, gender, company) {
Person.apply(this, [name, gender]); // ์ฌ๊ธฐ์ this๋ employee ์ธ์คํด์ค!
this.company = company;
}
var kd = new Student('๊ธธ๋', 'male', '์์ธ๋');
var ks = new Employee('๊ธธ์', 'female', '์ผ์ฑ');
//๋นํจ์จ
var numbers = [10, 20, 3, 16, 45];
var max = min = numbers[0];
numbers.forEach(function(number) {
// ํ์ฌ ๋์๊ฐ๋ ์ซ์๊ฐ max๊ฐ ๋ณด๋ค ํฐ ๊ฒฝ์ฐ
if (number > max) {
// max ๊ฐ์ ๊ต์ฒด
max = number;
}
// ํ์ฌ ๋์๊ฐ๋ ์ซ์๊ฐ min๊ฐ ๋ณด๋ค ์์ ๊ฒฝ์ฐ
if (number < min) {
// min ๊ฐ์ ๊ต์ฒด
min = number;
}
});
console.log(max, min);
์ฝ๋๊ฐ ๋๋ฌด ๊ธธ๊ณ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค.
pply๋ฅผ ์ ์ฉํด ๊ฐ๋
์ฑ๋ ๋์ด๊ณ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์.
//ํจ์จ
var numbers = [10, 20, 3, 16, 45];
var max = Math.max.apply(null, numbers);
var min = Math.min.apply(null, numbers);
console.log(max, min);
// ํผ์น๊ธฐ ์ฐ์ฐ์(Spread Operation)๋ฅผ ํตํ๋ฉด ๋ ๊ฐํธํ๊ฒ ํด๊ฒฐ๋ ๊ฐ๋ฅํด์
const numbers = [10, 20, 3, 16, 45];
const max = Math.max(...numbers);
const min = Math.min(...numbers);
console.log(max min);
call๊ณผ ๋น์ทํด ๋ณด์ด์ง๋ง, ์ฆ์ call๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฆ์ ํธ์ถํ์ง๋ ์๊ณ ๋๊ฒจ๋ฐ์ this ๋ฐ ์ธ์๋ค์ ๋ฐํ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
var func = function (a, b, c, d) {
console.log(this, a, b, c, d);
};
func(1, 2, 3, 4); // window๊ฐ์ฒด
// ํจ์์ this ๋ฏธ๋ฆฌ ์ ์ฉ
var bindFunc1 = func.bind({ x: 1 }); // ๋ฐ๋ก ํธ์ถ๋์ง๋ ์์์! ๊ทธ ์ธ์๋ ๊ฐ์์.
bindFunc1(5, 6, 7, 8); // { x: 1 } 5 6 7 8
// ๋ถ๋ถ ์ ์ฉ ํจ์ ๊ตฌํ
var bindFunc2 = func.bind({ x: 1 }, 4, 5); // 4์ 5๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉ
bindFunc2(6, 7); // { x: 1 } 4 5 6 7
bindFunc2(8, 9); // { x: 1 } 4 5 8 9
var func = function (a, b, c, d) {
console.log(this, a, b, c, d);
};
var bindFunc = func.bind({ x:1 }, 4, 5);
// func์ bindFunc์ name ํ๋กํผํฐ์ ์ฐจ์ด๋ฅผ ์ดํด๋ณด์ธ์!
console.log(func.name); // func
console.log(bindFunc.name); // bound func
var self = this;
var innerFunc2 = function() {
console.log(self); // ๋ด๋ถํจ์์ this ์ ๋ฌํ๊ธฐ ์ํด self ๋ณ์ ๋ฐ๋ก ์์ฑํด ์ฌ์ฉ
}
innerFunc2();
var obj = {
outer: function() {
console.log(this); // obj
var innerFunc = function () {
console.log(this);
};
// call์ ์ด์ฉํด์ ์ฆ์์คํํ๋ฉด์ this๋ฅผ ๋๊ฒจ์ฃผ์์ต๋๋ค
innerFunc.call(this); // obj
}
};
obj.outer();
var obj = {
outer: function() {
console.log(this);
var innerFunc = function () {
console.log(this);
}.bind(this); // innerFunc์ this๋ฅผ ๊ฒฐํฉํ ์๋ก์ด ํจ์๋ฅผ ํ ๋น
innerFunc();
}
};
obj.outer();
var obj = {
logThis: function () {
console.log(this);
},
logThisLater1: function () {
// 0.5์ด๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ถ๋ ฅํด์. ์ ์๋์ํ์ง ์์์.
// ์ฝ๋ฐฑํจ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ this๋ฅผ bindํด์ฃผ์ง ์์์ ์์ด๋ฒ๋ ธ์ด์!(์ ์ค)
setTimeout(this.logThis, 500);
},
logThisLater2: function () {
// 1์ด๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ถ๋ ฅํด์. ์ ์๋์ํด์.
// ์ฝ๋ฐฑํจ์์ this๋ฅผ bind ํด์ฃผ์๊ธฐ ๋๋ฌธ์ด์ฃ .
setTimeout(this.logThis.bind(this), 1000);
}
};
obj.logThisLater1();
obj.logThisLater2();
ํ์ดํ ํจ์๋ ์คํ ์ปจํ ์คํธ ์์ฑ ์, this๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ ์ด ์ ์ธ๋๋ค.
ํ์ดํ ํจ์ ๋ด๋ถ์๋ this์ ํ ๋น๊ณผ์ (๋ฐ์ธ๋ฉ ๊ณผ์ )์ด ์์ ์์ผ๋ฉฐ, ์ ๊ทผ ํ๊ณ ์ ํ๋ฉด ์ค์ฝํ ์ฒด์ธ์ ๊ฐ์ฅ ๊ฐ๊น์ด this์ ์ ๊ทผํ๊ฒ ๋จ
๋ฐ๋ผ์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ this์ฐํํ ์ ์๋๋ฐ, ์ด๋ call, apply, bind๋ณด๋ค ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ!
var obj = {
outer: function () {
console.log(this);
var innerFunc = () => {
console.log(this);
};
innerFunc();
};
};
obj.outer();