ํ์ดํ ํจ์
- ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๊ฐ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋์์ผ๋ก ์ ์ฉํ๋ค.
- ํ์ดํ ํจ์๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ non-constructor์ด๋ค.
- ์ค๋ณต๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ ์ธํ ์ ์๋ค.
- ํ์ดํ ํจ์๋ ํจ์ ์์ฒด์ this, arguments, super, new.target ๋ฐ์ธ๋ฉ์ ๊ฐ์ง ์๋๋ค.
1๏ธโฃ this
- this๋ฐ์ธ๋ฉ์ ํจ์์ ํธ์ถ ๋ฐฉ์, ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
- ์ผ๋ฐํจ์๋ก์ ํธ์ถ๋๋ ๋ชจ๋ ํจ์ ๋ด๋ถ์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ์ฝ๋ฐฑํจ์์๋ strict mode๊ฐ ์ ์ฉ๋์ด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ ๋ชจ๋ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์๋ undefined๊ฐ ๋ฐ์ธ๋ฉ๋๋ค!!
๐ฅ ํ์ดํ ํจ์๋ ํจ์ ์์ฒด์ this๋ฐ์ธ๋ฉ์ ๊ฐ์ง๊ณ ์์ง ์๋๋ค. ๋ฐ๋ผ์ ํ์ดํ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด ์์ ์ค์ฝํ์ this๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ค.
๐๐ป ์ค์ฝํ ์ฒด์ธ์์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์์ ํจ์ ์ค์์ ํ์ดํ ํจ์๊ฐ ์๋ ํจ์์ this๋ฅผ ์ฐธ์กฐํ๋ค.
- ํ์ดํ ํจ์๋ฅผ ์ ์ธํ ๋ชจ๋ ํจ์์๋ this ๋ฐ์ธ๋ฉ์ด ๋ฐ๋์ ์กด์ฌํ๋ค.
๐พ ์ฝ๋ฐฑํจ์๋ฅผ ํ์ดํ ํจ์๋ก ์ฌ์ฉ
function Person(name) {
this.name = name;
this.sayHi = function () {
setTimeout(() => {
console.log(`${this.name} Hi~!`);
}, 1000);
};
}
const me = new Person("Lee");
me.sayHi();
๐๐ป this๊ฐ ์์ ์ค์ฝํ์ ๋ฐ์ธ๋ฉ๋์ด Person์ ๊ฐ๋ฆฌํค๋ฏ๋ก Person.name = 'Lee'
๐พ ์ฝ๋ฐฑํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก ์ฌ์ฉ
function Person(name) {
this.name = name;
this.sayHi = function () {
setTimeout(function () {
console.log(`${this.name} Hi~!`);
}, 1000);
};
}
const me = new Person("Lee");
me.sayHi();
๐๐ป this๊ฐ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก window.name = ''
2๏ธโฃ Rest ํ๋ผ๋ฏธํฐ
- ํ์ดํ ํจ์์์๋ arguments ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์์ ์ค์ฝํ์ arguments ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ง๋ง ํ์ดํ ํจ์ ์์ ์๊ฒ ์ ๋ฌ๋ ์ธ์ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค
- ํ์ดํ ํจ์๋ก ๊ฐ๋ณ ์ธ์ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ ๋๋ Restํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ํจ์์ ์ ๋ฌ๋ ์ธ์๋ค์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ์ ๋ฌ ๋ฐ๋๋ค!
- ์ผ๋ฐ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ฐจ์ ์ผ๋ก ํ ๋น๋๋ค!
- Restํ๋ผ๋ฏธํฐ๋ ๋จ ํ๋๋ง ์ ์ธํ ์ ์๋ค.
- ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์๋ค.
- ์ ์ธํ ๋งค๊ฐ๋ณ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ํจ์ ๊ฐ์ฒด์ length ํ๋กํผํฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
function foo(param, ...rest) {
console.log(param);
console.log(rest);
}
foo(1, 2, 3, 4);
console.log(foo.length);
์ฐธ๊ณ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive 16์ฅ