-
ํ์ดํ ํจ์๋ ์ผ๋ฐ ํจ์์ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 26. 18:34
TLDR;
ํจ์์ ์ธ๋ฌธ๊ณผ ํจ์ํํ์์ ์ฐจ์ด
ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ํธ์ด์คํ ์ด ์ผ์ด๋๋ค. ์ฆ, ๋ฐํ์ ์ด์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ์ ์๋ณ์๋ฅผ ์๋ฌต์ ์ผ๋ก ์์ฑํ๊ณ ์์ฑ๋ ํจ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค. ( ๋ณ์ ํธ์ด์คํ ๊ณผ ๋ค๋ฅด๊ฒ undefined๊ฐ ์๋๋ผ ํจ์ ๊ฐ์ฒด๋ก ์ด๊ธฐํ๋๋ค.)
๋ฐ๋ฉด, ํจ์ํํ์์ ๋ณ์ ํธ์ด์คํ ์ด ๋ฐ์ํ์ฌ ํ ๋น๋ฌธ์ด ์คํ๋๋ ์์ ์ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๊ฐ ๋๋ค.ํ์ดํ ํจ์์ ์ผ๋ฐ ํจ์์ ์ฐจ์ด
- ํ์ดํ ํจ์๋ ํจ์ ์์ฒด์ this ๋ฐ์ธ๋ฉ์ ๊ฐ์ง ์์์, ํ์ดํ ๋ด๋ถ ํจ์์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด ์์ ์ค์ฝํ์ this๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ค. ์ด๋ฅผ lexical this๋ผ๊ณ ํ๋ค.
- ํ์ดํ ํจ์๋ constructor๊ฐ ์๊ธฐ ๋๋ฌธ์, new์ ํจ๊ป ํธ์ถํ ์ ์๋ค. ์ฆ ์์ฑ์ ํจ์๋ก์ ์ฌ์ฉํ ์ ์๋ค.
- arguments๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
์์์ ๋ฐ์ธ๋ฉ vs ๋ช ์์ ๋ฐ์ธ๋ฉ
this๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์๋๋ฐฉ์์ ๋ฐ๋ผ ๋ฐ์ธ๋ฉ ๋๋ ๊ฒ์ ์์์ ๋ฐ์ธ๋ฉ, call,apply,bind๋ฑ์ผ๋ก ๋ฐ์ธ๋ฉํด ์ฃผ๋ ๊ฒ์ ๋ช ์์ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํ๋ค.
๋ณธ ๊ธ์์๋ ํ์ดํ ํจ์์ ์ผ๋ฐ ํจ์ ์ฐจ์ด 3๊ฐ์ง๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ ์ ํ๋ค.
1. ํ์ดํ ํจ์๋ this๊ฐ ์๋ค.
ํ์ดํ ํจ์๋ ์ผ๋ฐ ํจ์์๋ ๋ฌ๋ฆฌ '๊ณ ์ ํ' this๋ฅผ ๊ฐ์ง์ง ์๊ณ , ์ธ๋ถ์์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ๋ง์ฝ ํ์ดํ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด ์ผ๋ฐ์ ์ธ ์๋ณ์์ฒ๋ผ ์ค์ฝํ์ฒด์ธ์ ํตํด ์์ ์ค์ฝํ์์ this๋ฅผ ํ์ํ๋ค.
const obj = { say() { console.log(this); // [object Object] const f = function() { console.log(this); }; // [object Window] f(); const g = () => { console.log(this); } // [object Object] g(); } }; obj.say();
1) ์์ ์ฝ๋์์ ์ฒซ๋ฒ์งธ this์ ๊ฒฝ์ฐ, obj๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
2) ๋ ๋ฒ์งธ๋ก ๋ฉ์๋์์์ ์ผ๋ฐ ํจ์๋ก ์ ์ํ ๊ฒฝ์ฐ this๋ ํจ์๋ก ํธ์ถํ๊ธฐ ๋๋ฌธ์ Window๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
3) ๋ง์ง๋ง์ผ๋ก, ๋ฉ์๋ ์์์ ํ์ดํ ์์์ ์ ์ํ ๊ฒฝ์ฐ this๋ ๋ณ๋๋ก ๊ฐ๋ฆฌํค๋ ๋์์ด ์๊ธฐ ๋๋ฌธ์ ์์ ์ ์ธ๋ถ ์ค์ฝํ์ธ sayํจ์๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ this์ธ obj๋ฅผ ๋์ผํ๊ฒ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
์ด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
์ด์ฒ๋ผ ํ์ดํ ํจ์ ๋ณธ๋ฌธ์์ this์ ์ ๊ทผํ๋ฉด ์ธ๋ถ์์ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ฐ, ์ด๋ฌํ ํน์ฑ์ ํ์ฉํด์ ๊ฐ์ฒด์ ๋ฉ์๋ ์์์ ๋์ผ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋์์ผ๋ก ์ํํ ๋ ์ฌ์ฉ ํ ์ ์๋ค.
[ํ์ดํ ํจ์ ์ฌ์ฉ ์์]
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ this.title์ ํ์ดํ ํจ์ ๋ฐ์ ์๋ ๋ฉ์๋์ธ showList๊ฐ ๊ฐ๋ฆฌํค๋ ๋์๊ณผ ๋์ผํด์ง๋ค. ์ฆ (this.title === group.title)์ด ๋๋ค.let group = { title: "1๋ชจ๋ ", students: ["๋ณด๋ผ", "ํธ์ง", "์ง๋ฏผ"], showList() { this.students.forEach(student => alert(this.title ': ' + student)); } }; group.showList();
[์ผ๋ฐ ํจ์ ์ฌ์ฉ ์์]
forEach์ ์ ๋ฌ๋๋ ํจ์์ this๊ฐ window๋ฅผ ๊ฐ๋ฆฌ์ผ ์๋ฌ๊ฐ ๋๋ค.let group = { title: "1๋ชจ๋ ", students: ["๋ณด๋ผ", "ํธ์ง", "์ง๋ฏผ"], showList(){ this.students.forEach(function(student)){ //TypeError: Cannot read property 'title' of undefined alert(this.title + ': ' + student) }); } }; group.showList();
2. ํ์ดํ ํจ์๋ new์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
ํ์ดํ ํจ์๋ ์์ฑ์๋ก์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ new์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
const Person = (name, age) => { this.name = name; this.age = age; } const tom = new Person('Tom', 18); // Uncaught TypeError: Person is not a constructor
3. ํ์ดํ ํจ์์๋ 'arguments'๊ฐ ์๋ค.
ํ์ดํ ํจ์๋ ํจ์์์ฒด์ arguments ๋ฐ์ธ๋ฉ์ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์, ํ์ดํ ํจ์ ๋ด๋ถ์์ arguments๋ฅผ ์ฐธ์กฐํ๋ฉด this์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ค์ฝํ์ arguments๋ฅผ ์ฐธ์กฐํ๋ค.
(function(){ const foo = () => console.log(arguments); //ํ์ดํ ํจ์ foo์ arguments๋ ์์ ์ค์ฝํ์ธ ์ฆ์์คํํจ์์ arguments๋ฅผ ๊ฐ๋ฆฌํจ๋ค. (1, 2๋ฅผ ๊ฐ๋ฆฌํด) foo(3,4); }(1,2)) const foo = () => console.log(argments); foo(1,2); // ReferenceError: arguments is not defined
arguments ๊ฐ์ฒด๋ ํจ์๋ฅผ ์ ์ํ ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ฅผ ํ์ ํ ์ ์๋ ๊ฐ๋ณ ์ธ์ ํจ์๋ฅผ ๊ตฌํํ ๋ ์ ์ฉํ๋ค. ํ์ง๋ง ํ์ดํ ํจ์์์๋ arguments ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์์ ์ค์ฝํ์ arguments ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์๋ ์์ง๋ง ํ์ดํ ํจ์ ์์ ์๊ฒ ์ ๋ฌ๋ ์ธ์ ๋ชฉ๋ก์ ํ์ธํ ์ ์๊ณ , ์์ ํจ์์๊ฒ ์ ๋ฌ๋ ์ธ์ ๋ชฉ๋ก์ ์ฐธ์กฐํ๋ฏ๋ก ๊ทธ๋ค์ง ๋์์ด ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ํ์ดํ ํจ์๋ก ๊ฐ๋ณ ์ธ์ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ ๋๋ Rest ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก
Rest ํ๋ผ๋ฏธํฐ
๋ ํจ์์ ์ ๋ฌ๋ ์ธ์๋ค์ ๋ชฉ๋ก์๋ฐฐ์ด๋ก ์ ๋ฌ
๋ฐ๋๋ค. ์ผ๋ฐ arguments๋ฅผ ์ด์ฉํ๋ฉด, arguments ์์ฒด๊ฐ ๋ฐฐ์ด์ด ์๋ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ด๋ฏ๋ก ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Function.prototype.call์ด๋ Function.prototype.apply๋ก arguments๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ณํ
ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์๋ค.function foo(...rest){ console.log(rest); // [1,2,3,4,5] }
rest ํ๋ผ๋ฏธํฐ์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ณ์ธ์ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์๋ค.
[restํ๋ผ๋ฏธํฐ + ํ์ดํ ํจ์]
function sum(...args) { return args.reduce((pre, cur) => pre+,cur, 0); } console.log(sum(1,2,3,4,5));
[arguments + ์ผ๋ฐ ํจ์]
function sum() { var array = Array.prototype.slice.call(arguments); return array.reduce((function (pre,cur){ return pre + cur; }, 0);) }