์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ ๋๋ ์์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ๋ ์ผ
1. ํธ์ด์คํ
2. ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด ๊ตฌ์ฑ
3. this ๊ฐ ์ค์
์ ๋ฒ ๊ฐ์์๋ 1.ํธ์ด์คํ ์ ๋ํด ์์ธํ ์์๋ดค๋ค.
์ด๋ฒ์๋ 2.์ธ๋ถ ํ๊ฒฝ ์ ๋ณด ๊ตฌ์ฑ์ 3.this ๊ฐ ์ค์ ์ ๋ํด ์์๋ณด์.
1. VariableEnvironment(VE)์ LexicalEnvironment(LE)
์ฐ์ VE์ LE์ ์ฐจ์ด์ ๋ํด ์์๋ณด์.
์ด ๋์ ๋ชจ๋ ๋์ผํ์ง๋ง ์ค๋ ์ท ์ ์ง ์ฌ๋ถ๊ฐ ๋ค๋ฅด๋ค.
VE๋ ์ค๋ ์ท์ ์ ์งํ์ง๋ง, LE๋ ์ค๋ ์ท์ ์ ์งํ์ง ์๋๋ค. ์ฆ, ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ๊ณ์ํด์ ๋ฐ์ํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฐ๋ผ์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ VE์ ์ ๋ณด๋ฅผ ๋จผ์ ๋ด์ ํ์ LE๋ ์ด๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๊ณ , ๊ทธ ์ดํ๋ถํฐ๋ LE๋ฅผ ํ์ฉํ๊ฒ ๋๋ค.
์ ์ด์ ๋ ์์ธํ ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด ๊ตฌ์ฑ์ ๋ํด ์์ธํ ์์๋ณด์.
์คํ ์ปจํ ์คํธ๋ environmentRecord(=record)์ outerEnvironmentReference(=outer)๋ก ๊ตฌ์ฑ๋๋ค.
record์๋ ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์๋ณ์ ์ ๋ณด(ํจ์์ ๋งค๊ฐ๋ณ์, ์๋ณ์, ํจ์ ์์ฒด, var๋ก ์ ์ธ๋ ์๋ณ์)๊ฐ ์ ์ฅ๋๋ค.
outer์๋ ์ปจํ ์คํธ๊ฐ ์๊ฒจ๋ ๋์ ํ๊ฒฝ์ ๋ณด๊ฐ ๋ด๊ธด๋ค.
** ๊ฐ๊ฐ์ ์คํ ์ปจํ ์คํธ๋ LE ์์ record์ outer๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ,
outer ์์๋ ๊ทธ ์คํ ์ปจํ ์คํธ๊ฐ ์ ์ธ๋ ๋น์์ LE์ ๋ณด๊ฐ ๋ค ๋ค์ด์๊ธฐ ๋๋ฌธ์
scope chain์ ์ํด ์์ ์ปจํ ์คํธ์ record๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
์๋์ ์์๋ฅผ ์ ๋ฆฌํ๋ฉด์ ๊ฐ๋ ์ ๋ช ํํ ์ดํดํด๋ณด์.
var a = 1;
var outer = function () {
var inner = function () {
console.log(a); //undefined
var a = 3;
};
inner();
console.log(a); //1
};
outer();
console.log(a); //1
1. ์ฝ์คํ์ ์ ์ญ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- ํธ์ด์คํ ์ด ์ผ์ด๋๊ณ record์ ์๋ณ์ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค. ( var a; var outer; )
- a์ 1์ด ํ ๋น๋๊ณ outer์ ํจ์๊ฐ ํ ๋น๋๋ค.
- outer() ํจ์๊ฐ ์ฝ์คํ์ ์์ด๋ฉด์ ์ ์ญ ์ปจํ ์คํธ๊ฐ ์ค๋จ๋๋ค.
2. ์ฝ์คํ์ outer ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- ํธ์ด์คํ ์ด ์ผ์ด๋๊ณ record์ ์๋ณ์ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค. ( var inner; )
- outer(=outerEnvironmentReference)์ ์ค์ฝํ ์ฒด์ธ์ ์ ์ญ ์ปจํ ์คํธ์ LE๋ฅผ ์ฐธ์กฐํ๋ค.
- innerํจ์๊ฐ ์ฝ์คํ์ ์์ด๋ฉด์ outer ํจ์๊ฐ ์ค๋จ๋๋ค.
3. ์ฝ์คํ์ inner ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- ํธ์ด์คํ ์ด ์ผ์ด๋๊ณ record์ ์๋ณ์ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค. ( var a; )
- outer(=outerEnvironmentReference)์ ์ค์ฝํ ์ฒด์ธ์ outer ์ปจํ ์คํธ์ LE๋ฅผ ์ฐธ์กฐํ๋ค.
- ์ฝ์์ a๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด inner์ค์ฝํ์ ๋ด๋ถ์์ ์๋ณ์ a๋ฅผ ์ฐพ๋๋ค.
- a๋ฅผ ์ฐพ์์ง๋ง ์์ง ๊ฐ์ด ํ ๋น๋๊ธฐ ์ ์ด๊ธฐ๊ฐ์ธ undefined๊ฐ ์ถ๋ ฅ๋๋ค.
- a์ 3์ด ํ ๋น๋๋ค.
- innerํจ์๊ฐ ์ข ๋ฃ๋๊ณ ์ฝ์คํ์์ ์ ๊ฑฐ๋๋ค.
4. ์ค๋จ๋์๋ outerํจ์๊ฐ ๋ค์ ์คํ๋๋ค.
- ์ฝ์์ a๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด outer ์ค์ฝํ ๋ด๋ถ์์ ์๋ณ์ a๋ฅผ ์ฐพ๋๋ค.
- a์ ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์์ outer ์ปจํ ์คํธ์ outer(=outerEnvironmentReference)์ ์ค์ฝํ ์ฒด์ธ์์ ๋ฐ๋ผ ์ ์ญ ์ปจํ ์คํธ์ LE๋ฅผ ํ์ํ๋ค.
- ์ ์ญ ์ปจํ ์คํธ LE record์ a ๊ฐ 1์ด ์กด์ฌํ๋ค.
- ์ฝ์์ 1์ ์ถ๋ ฅํ๋ค.
- outerํจ์๊ฐ ์ข ๋ฃ๋๊ณ ์ฝ์คํ์์ ์ ๊ฑฐ๋๋ค.
5.์ ์ญ ์ปจํ ์คํธ๊ฐ ๋ค์ ํ์ฑํ๋๋ค.
- ์ ์ญ ์ปจํ ์คํธ record์ a๊ฐ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฝ์์ ํด๋น ๊ฐ์ธ 1์ ์ถ๋ ฅํ๋ค.
๋ง์ฝ, inner ํจ์ ๋ด๋ถ์ var a = 3;์ด ์๋ค๋ฉด
inner ์ปจํ ์คํธ๋ ์ค์ฝํ ์ฒด์ธ์ ๋ฐ๋ผ outer ์ปจํ ์คํธ๋ฅผ ํ์ํ๋ค.
ํ์ง๋ง outer ์ปจํ ์คํธ ๋ด๋ถ์๋ a์ ์ ๋ณด๊ฐ ์์ด ์ค์ฝํ ์ฒด์ธ์ ๋ฐ๋ผ ์ ์ญ ์ปจํ ์คํธ์์ a์ ๊ฐ์ ๋ฐ์์จ๋ค.
2. this
this๋ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ ๊ฒฐ์ ๋๋ค. ์ด๋ this๊ฐ bind๋๋ค๊ณ ํ๋ค.
ํจ์๊ฐ ์ ์๋ ๋๊ฐ ์๋๋ผ ์คํ ๋ ๋ ์คํ ์ฃผ์ฒด์ ๋ฐ๋ผ this๊ฐ ๋ฐ๋๋ค.
์๋์ ์์๋ก this๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
var obj1 = {
outer : function () {
console.log(this); // obj1 { outer : function () {} }
var innerFunc = function () {
console.log(this); // node ๊ธ๋ก๋ฒ ๊ฐ์ฒด, // obj2 { innerMethod : innerFunc }
};
innerFunc();
var obj2 = {
innerMethod : innerFunc,
};
obj2.innerMethod();
}
};
obj1.outer();
์ด๋ฅผ ์ํดํ๊ธฐ ์ํด์ ๋จผ์ ํจ์์ ๋ฉ์๋์ ์ฐจ์ด๋ฅผ ์์์ผ ํ๋ค.
ํจ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ํํ๋ค.
ํจ์๋ฅผ ํธ์ถํ ๋, ๋จ์ง ํจ์๋ช ();์ผ๋ก ํธ์ถํ๋ ๊ฒ์ผ๋ก๋ ์ ์ ์๋ค.
ํธ์ถ ์์ ์ ์คํ ์ฃผ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ํจ์ ๋ด๋ถ์์ this๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
ํ์ฌ ์ฝ๋ ์คํ ํ๊ฒฝ์ node์ด๋ฏ๋ก, node์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
(๋ง์ฝ, ๋ธ๋ผ์ฐ์ ์ฝ์์ฐฝ์ this๋ฅผ ์ถ๋ ฅํ๋ค๋ฉด window ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒ์ด๋ค.)
๋ฐ๋ฉด ๋ฉ์๋๋ ๊ฐ์ฒด์ ํธ์ถ์ ์ํด ๋์ํ๋ค.
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ฉด ๊ฐ์ฒด.๋ฉ์๋๋ช ();์ ํ์์ผ๋ก ์ ๋ ฅํด์ผ ํ๋ค.
์ฆ ์์ ํญ์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด์ธ ์คํ ์ฃผ์ฒด๊ฐ ์์ด์ผ ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋งค์๋ ๋ด๋ถ์์ this๋ ํด๋น ๋งค์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ๋ฐํ์ผ๋ก ์์ ์ฝ๋๋ฅผ ํด์ํด๋ณด์.
1.๋จผ์ obj1์ ๋ฉ์๋ outer()๋ฅผ ์คํํ๋ค.
2.console์์ this๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ด ๋ this๋ ํด๋น ๋ฉ์๋๋ฅผ ์คํ์ํจ ์ฃผ์ฒด ์ฆ, obj1์ด ๋๋ค.
3. innerFunc() ํจ์๋ฅผ ์คํํ๋ค.
- innerFunc(); ํธ์ถ ๋ฐฉ์๋ง ๋ด๋ ์ผ๋ฐ ํจ์์์ ์ ์ ์๋ค. ํ์ฌ node.js์ ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ํจ์ ๋ด๋ถ์ ์ฝ์์๋ node.js ๊ธ๋ก๋ฒ ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ค.
4. obj2.innerMethod(); ์ฆ obj2์ innerMethod ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- innerMethod๊ฐ innerFunc๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก nnerFunc ํจ์๊ฐ ์คํ๋๋ค.
- ์ฌ๊ธฐ์ this๋ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ์ฃผ์ฒด, ์ฆ obj2๊ฐ ๋๋ค.
- ๋ฐ๋ผ์ ์ด๋ฒ์๋ ์ฝ์์ obj2๊ฐ ์ถ๋ ฅ๋๋ค.
์ฌ๊ธฐ์ ์ ๊น ! ๋ฉ์๋ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ์ด ์์๊น?
๋ค ์์ต๋๋ค. ๋ณ์ ํ์ฉํ๊ธฐ or ํ์ดํ ํจ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ํ๋ฉด ๋ฉ๋๋ค.
์ฐ์ ๋ณ์๋ฅผ ํ์ฉํด๋ณด์.
const person = {
name : 'Dana',
sayHello : function () {
const self = this;
function innerFunc() {
console.log(`hello ${self.name}`);
}
innerFunc();
}
}
person.sayHello();
sayHelloํจ์ ๋ด๋ถ self๋ผ๋ ๋ณ์์ this๋ฅผ ํ ๋นํด ์ฃผ์๋ค.
์ฌ๊ธฐ์ this๋ ์ด ๋ฉ์๋์ ์คํ ์ฃผ์ฒด์ธ person๊ฐ์ฒด๊ฐ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ innerFunc() ํจ์๋ฅผ ์คํํ๋ค.
ํจ์ ๋ด๋ถ์์๋ self๋ฅผ ์ด์ฉํด person๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ฝ์์ ์ถ๋ ฅํ ์ ์๊ฒ ๋๋ค.
๋ง์ฝ self์ this๋ฅผ ํ ๋นํ์ง ์๋๋ค๋ฉด, innerFunc ํจ์ ๋ด๋ถ์์ this๋ node.js์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋๊ธฐ ๋๋ฌธ์
์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ถ๋ ฅ๊ฐ์ ์ป์ง ๋ชปํ ๊ฒ์ด๋ค.
๋ณ์๋ฅผ ํ์ฉํ์ฌ this๋ฅผ ์ฐํํ๋ ๊ฒ์ ํ๋์ฝ๋ฉ์ด๊ธฐ ๋๋ฌธ์ ์ต๊ทผ์๋ ํ์ดํ ํจ์๋, call, apply, bind๋ฅผ ๋ ์ฌ์ฉํ๋ ์ฐธ๊ณ ํ์.
๋ค์์ผ๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด๋ณด์.
const person = {
name : 'Dana',
sayHello : function () {
const innerFunc = () => {
console.log(`hello ${this.name}`);
}
innerFunc();
}
}
person.sayHello();
์์ ๊ฐ์ ์์ ๋ฅผ ํ์ดํ ํจ์๋ก ๋ฐ๊ฟ๋ณด์๋ค.
sayHello() ๋ด๋ถ ํจ์์ innerFunc๋ฅผ ํ์ดํ ํจ์๋ก ๋ง๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํจ์ ํธ์ถ์ ํ์ ๋
๋๋๊ฒ๋ ํ์ดํ ํจ์๋ก ๋ง๋ innerFunc์ this๊ฐ person๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ์ถ๋ ฅํ์๋ค.
์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ํ์ดํ ํจ์๋ this๋ฅผ bindingํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ ์์ ์์์์๋
innerFunc๋ด๋ถ์์ this๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ฝํ์ฒด์ธ์ ๋ฐ๋ผ sayHello()๋ฅผ ํ์ํ๋ค.
sayHello์์ this๋ person๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์, innerFunc์์ this๋ฅผ ์ ์ ์๋ ๊ฒ์ด๋ค.
2-1. ์ฝ๋ฐฑํจ์์์์ this
์ฝ๋ฐฑํจ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this๋ ๋ชจ๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋จ, ์ฝ๋ฐฑํจ์์ ๋ณ๋๋ก this๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ๋ ์์ธ์ด๋ค.
์๋ฅผ๋ค์ด, addEventListener ๋ฉ์๋๋ ์ฝ๋ฐฑํจ์ ํธ์ถ ์, ์์ ์ this๋ฅผ ์์ํ๋๋ก ํ๋ก๊ทธ๋๋ฐ ๋์ด ์๋ค.
๋ฐ๋ผ์ ์ด๋ this๋ addEventListener๋ฅผ ํธ์ถ ์ํค๋ ์ฃผ์ฒด๊ฐ ๋๋ค. ( ex : button ํ๊ทธ )
const array = [1,2,3,4,5];
array.forEach(function(item) {console.log(this)}); // node.js ์ ์ญ ๊ฐ์ฒด๊ฐ 5๋ฒ ์ถ๋ ฅ
2-2. ์์ฑ์ ํจ์ ๋ด๋ถ์์์ this
const Person = function (name,age,isAdult) {
this.name = name;
this.age = age;
this.isAdult = isAdult;
}
const person1 = new Person('Dana',30,true);
const person2 = new Person('Baby',5,false);
console.log('person1',person1); // Person { name: 'Dana', age: 30, isAdult: true }
console.log('person2',person2); // Person { name: 'Baby', age: 5, isAdult: false }
์ฌ๊ธฐ์ ์ด๋ป๊ฒ this๋ฅผ ์ฌ์ฉํด์ property๋ฅผ ๋ง๋ค ์ ์์๊น?
๊ทธ ์ด์ ๋ ์์ฑ์ ํจ์๊ฐ ๋์ํ๋ ๋ฐฉ์์ ์๋ค.
์์ฑ์ ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ๋น๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ์ด ๊ฐ์ฒด๊ฐ ์์ฑ์ ํจ์๊ฐ ์๋ก ์์ฑํ๋ ๊ฐ์ฒด์ด๋ฉฐ, this๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
๋ฐ๋ผ์ ์์ฑ์ ํจ์ ๋ด๋ถ์์ this๋ ๋ฐ๋ก ์ด ๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋น๊ฐ์ฒด์ this๋ฅผ ํ์ฉํด ํ๋กํผํฐ๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด๋ค.
3. ๋ช ์์ this binding
์๋์ผ๋ก ๋ถ์ฌ๋๋ ์ํฉ๋ณ this๊ฐ ์๋๋ผ ๋ณ๋์ ๊ฐ์ this์ ์ ์ฅํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค.
3-1. call ๋งค์๋
ํธ์ถ ์ฃผ์ฒด์ธ ํจ์๋ฅผ ์ฆ์ ์คํํ๋ค.
์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ this๋ก bindingํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ช ์์ ์ผ๋ก binding์ ํ ์ ์๋ค.
const food = {
name : 'ํผ์',
sale : function (price) {
console.log(`${this.name}๋ ${price}์ ์
๋๋ค.`) // ํ๋ฒ๊ฑฐ๋ 10000์ ์
๋๋ค.
}
}
food.sale.call({ name : 'ํ๋ฒ๊ฑฐ' },10000);
call ๋งค์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด, sale ํจ์ ๋ด๋ถ์ this๋ food๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํด 'ํผ์'๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์์์์๋ call ๋งค์๋๋ฅผ ์ด์ฉํด ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ this๋ก bindingํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด
sale ํจ์ ์คํ ์ this.name์ 'ํ๋ฒ๊ฑฐ'๋ก ์ถ๋ ฅํ๊ฒ ๋๋ค.
3-2. apply ๋งค์๋
call๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ์ถ ์ฃผ์ฒด์ธ ํจ์๋ฅผ ์ฆ์ ์คํํ๋ฉฐ, ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ bindingํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค.
๋ค๋ง ๋๋จธ์ง ๋ถ๋ถ์ ๋ฐฐ์ด์ ํํ๋ก ๋๊ฒจ์ค๋ค.
const food = {
name : 'pizza',
sale : function (price) {
console.log(`${this.name}๋ ${price}์ ์
๋๋ค.`)
}
}
food.sale.apply({ name : 'hamburger'},[10000]);
3-3. bind ๋งค์๋
call๊ณผ ๋น์ทํ์ง๋ง, ์ฆ์ ํธ์ถํ์ง ์๊ณ ๋๊ฒจ๋ฐ์ this์ ์ธ์๋ค์ ๋ฐํ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ค.
bind๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํจ์์ this๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉํ๋ค.
- ํจ์๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ๋ฏธ๋ฆฌ ์ ์ฉํ ์ ์๋ค.
function getAverage (x,y) {
const average = (x + y) / this.theNumberOfStudents;
return average;
}
const getAverageByBind = getAverage.bind({theNumberOfStudents : 10})
const averageByCall = getAverage.call({ theNumberOfStudents : 10}, 20,30);
const averageByBind = getAverageByBind(20,30);
console.log(averageByCall); // 5
console.log(averageByBind); // 5
const getAverageByOneScore = getAverageByBind.bind(null,30);
const averageByOneScore = getAverageByOneScore(60);
console.log(averageByOneScore); // 9
์์ ์์์์๋ getAverage ํจ์ ๋ด๋ถ์ this๋ก ๊ฐ์ ๊ฐ์ ธ์ ์ฐ์ฐ์ ์ํํ๋๋ก ํ์๋ค.
์ฐ์ getAverageByBind๋ bind๋ฅผ ํตํด this๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉํ๋ค.
๋ฐ๋ผ์ getAverageByBind(20,30); ํจ์๋ฅผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง,
call ๋งค์๋๋ฅผ ์ฌ์ฉํ์ ๋์๋ ๋ฌ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก this๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ง ์๋๋ค.
call๋งค์๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋ณ์ averageByCall์ ํ ๋น๋ ๊ฐ์ ๋ณด๋ฉด ๋๋๋ฐ, ๋งค๊ฐ๋ณ์๋ก this ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ณ ์๋ค.
๋ค์์ผ๋ก ๋ณ์ averageByOneScore์ ๊ฐ์๋ณด๋ฉด ๋งค๊ฐ๋ณ์๋ก 60๋ง ์ ๋ฌํ๊ณ ์๋ค.
์ด๋ getAaverageByBindํจ์์ bind ๋งค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ ๋งค๊ฐ๋ณ์ 30์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ์ ์ถ๋ ฅ ๊ฐ ์ญ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ๋๋ก ๋ฐํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ค๋์ ํ๊ณ
๊ทธ๋์ ์ฝ๋๋ฅผ ์น๊ธฐ๋ง ํ์ง ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ํํ ๋์ ์๋ฆฌ๋ ์ ์์ง ๋ชปํ๋ค.
์ด๋ฒ 3์ฃผ์ฐจ ๊ฐ์๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ง์ ๊ฒ์ ๋ฐฐ์๊ฐ๋ ๊ฑฐ ๊ฐ์ ๋ฟ๋ฏํ๋ค.
์คํ ์ปจํ ์คํธ๋ ์ด์ ์ด๋์ ๋ ๊ฐ์ ์ก์๋๋ฐ
call, apply, bind ๋ชจ๋ ์์ง ๋ฏ์ค์ด์ ๊ฐ์ด ์ ์ ์กํ๋ค.
๋ฐ๋ณตํ๋ค ๋ณด๋ฉด ๋์๋ ์ต๊ณ ์์๋ ์ต๊ฒ ์ง^_ ใ
ํ์ดํ ์ด๋ค ํ์ดํ ..
'๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ์ธ๊ณผ์ /TroubleShooting] Uncaught SyntaxError: Cannot use import statement outside a module (0) | 2025.01.09 |
---|---|
[JS/๋ฌ๋ฆฌ๊ธฐ๋ฐ] 250108 TIL - ๋ฐฐ์ด (0) | 2025.01.08 |
[JS/๋ฌ๋ฆฌ๊ธฐ๋ฐ] 250106 TIL (0) | 2025.01.06 |
[์๋ฐ์คํฌ๋ฆฝํธ๋ฌธ๋ฒ์ข ํฉ๋ฐ3์ฃผ์ฐจ] 250105 TIL (0) | 2025.01.05 |
[์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ ์ข ํฉ๋ฐ 3์ฃผ์ฐจ] 250103 TIL (2) | 2025.01.03 |