3์ฃผ์ฐจ ๊ณผ์ ์ ํจ๊ป ๋ณธ๊ฒฉ์ ์ผ๋ก Vanilla JS๋ฅผ ํตํด ํ๋ก๊ทธ๋๋ฐํ๋ ๋ฒ์ ๋ํ ๊ฐ์๋ฅผ ์๊ฐํ๋ ์๊ฐ์ด ์์ฒญ ๋ถ์กฑํ๋ค. ๋งค์ผ TIL์ ์์ฑํ ์ฌ๋ ฅ์ด ์์ด 3์ฃผ์ฐจ ๊ณผ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ณ ๋ฐฐ์ด ๋ด์ฉ์ ๋ณต๊ธฐํ๋ค.
JavaScript ์ฌ์ ํด์ฆ
์ฌ์ ํด์ฆ๋ฅผ ํตํด JavaScript๋ก ํ๋ก๊ทธ๋๋ฐํ๋ฉด์ ๋์น ์ ์๋ ์ฌ์ํ์ง๋ง ์ค์ํ ํฌ์ธํธ๋ค์ ๋ฐฐ์ ๋ค.
this
- ์คํ์ ํจ์ ๋ด์์ this
์์ฑ์ ํจ์์์ new ์ฐ์ฐ์๋ฅผ ๋ถ์ด์ง ์๊ณ ํธ์ถํ๊ฒ ๋๋ฉด this๊ฐ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋์ด ๋ฒ๋ฆฐ๋ค. ์๋ ์์์์๋ ์ ์ญ๊ฐ์ฒด์ this๊ฐ ๋ฐ์ธ๋ฉ ๋๋ฏ๋ก ์์ฑ์ ์ฐพ์ ์ ์์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.function Person(name, age) { this.name = name; this.age = age; } const person1 = Person('ikjun', 11); // this๊ฐ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ console.log(person1.name); /* Uncaught TypeError: Cannot read properties of undefined (reading 'name') ์ ์ญ๊ฐ์ฒด์๋ name ์์ฑ์ด ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์ */
์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์์ฑ์ ํจ์์
new
ํค์๋๋ฅผ ๋ถ์ฌ ์๋ก์ด ๊ฐ์ฒด์ this๋ฅผ ๋ฐ์ธ๋ฉํด์ค์ผ ํ๋ค.const person1 = new Person('ikjun', 11); // this๊ฐ Person ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ console.log(person1.name); // ikjun, ์ ์ ์ถ๋ ฅ
- ๋ฉ์๋ ์์์์ this
ํจ์๊ฐ ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ด๋ฉด ๋ฉ์๋๋ก ํธ์ถ๋๋ค. ์ด๋ ๋ฉ์๋ ๋ด๋ถ์ this๋ ๋ณธ์ธ์ ์์ ํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.const obj1 = { name: 'Cho', sayName: function () { console.log(this.name); // ์ฌ๊ธฐ์ this๋ obj1 }, }; const obj2 = { name: 'ikjun', member: { frontend: { sayName: function () { console.log(this.name); // ์ฌ๊ธฐ์ this๋ member }, }, }, }; obj1.sayName(); // Cho obj2.member.frontend.sayName(); // undefined
- arrow function์์์ this
ํ์ดํ ํจ์์ this๋ ์์ ์ค์ฝํ์ this๋ฅผ ๊ฐ๋ฅดํจ๋ค. ๋ค์ ๋งํด์ ํ์ดํ ํจ์ ๋ด๋ถ์ this๊ฐ ์ค์ ๋์ง ์๋๋ค๋ ์๋ฏธ์ด๋ค.
์๋์ ์์์์ this๋ person ๊ฐ์ฒด๊ฐ ์๋ ์์ ์ค์ฝํ์ธ ์ ์ญ ๊ฐ์ฒด์ด๋ฏ๋ก this๋ฅผ ์ถ๋ ฅํ๋ฉด{}
๊ฐ ๋์จ๋ค.const person = { name: 'ikjun', sayHi: () => console.log(`Hi ${this.name}`), }; person.sayHi(); // Hi undefined console.log(this); // {}
์ฆ์์คํํจ์(IIFE, Immediately Invoke Function)
์ด์ ์๋ ๋ค๋ฃจ์๋ ์ฆ์์คํํจ์๋ฅผ ๋ค์ ํ์ฉํ๋ ๋ฒ์ ๋ฐฐ์ ๋ค.
์ฆ์์คํํจ์๋ ์ต์ด 1๋ฒ๋ง ํธ์ถ๋๋ฉฐ ์ ์์ ๋์์ ์คํ๋๋ค. ๋ฐ๋ผ์ ํ๊ฒฝ ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์ ์ค์ผ(์ถฉ๋)์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ํด๋ก์ ์ private ํจ๊ณผ๋ฅผ ๋์ผํ๊ฒ ์ป์ ์ ์๋ค.(function iife(name) { const value = 12; console.log(`hello! ${name}`); })('ikjun'); // hello! ikjun
console.log(value); // ReferenceError: value is not defined, ๋ด๋ถ ๋ณ์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๊ธฐ์กด ์ฝ๋ฉ ํ ์คํธ๋ฅผ ํ๋ฉด์๋ ๊ฑฐ์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ๋๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ต๊ด์ ๊ฐ์ ธ์ผ ํ๋ค.
์๋ ์์์ ๊ฐ์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ปดํจํฐ์๊ฒ ์ผ์ผํ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๋ฌด์์ ์ํ๋์ง์ ์ด์ ์ ๋ง์ถฐ ์ ์ ํ ๊ณ ์ฐจ ํจ์(map
,filter
,forEach
๋ฑ)๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ๋ ๋์์ง๊ณ ์ค์ํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.// ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ function double1(arr) { let results = []; for (let i = 0; i < arr.length; i++) { results.push(arr[i] * 2); } console.log(results); } // ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ function double2(arr) { console.log(arr.map((number) => number * 2)); } const arr = [1, 2, 3]; double1(arr); // [ 2, 4, 6 ] double2(arr); // [ 2, 4, 6 ]
๋น๋๊ธฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค
ํน์ ์ฝ๋์ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ์ฝ๋์ ์คํ์ ๋ฉ์ถ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ JavaScript์ ๊ณ ์ ํ ํน์ฑ์ด๋ค.
ex)addEventListener
,setInterval
,setTimeout
,XMLHttpRequest
XHR(XMLHttpRequest)
๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ๋ก ์์ฒญํ๊ณ , ์์ฒญ ํ์ ๋์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ค.
function request(url, successCallback, failCallback) { const xhr = new XMLHttpRequest(); xhr.addEventListener('load', (e) => { if (xhr.readyState === 4) { if (xhr.status === 200) { successCallback(JSON.parse(xhr.responseText)); } else { failCallback(xhr.statusText); } } }); xhr.addEventListener('error', (e) => failCallback(xhr.statusText)); xhr.open('GET', url); xhr.send(); }
Callback
๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์กฐํํ๋ค๋ฉด callback ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ๋ฐ๊ณ ๋ค์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด๋๊ฐ๋ค. ์๋๋ ์์
request
ํจ์๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ callback ํจ์๋ก ๋๊ฒจ๋ฐ๋ ์์ ์ฝ๋์ด๋ค.const API_URL = 'https://ikjun.todoList'; request(`${API_URL}/todos`, (todos) => { const completedTodo = todos.find((todo) => todo.isCompleted); if (completedTodo) { request(`${API_URL}/comments?todo.id=${completedTodo.id}`, (comments) => { comments.forEach((comment) => console.log(comment.content)); }); } });
์ผ๋ฐ์ ์ธ callback ํจํด์ ๊ฒฝ์ฐ์๋ ์ค์ฒฉ๋์ด ๋๊ฐ๋ค. ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋น๋๊ธฐ ์์ ์ด ๋๋ฌด ๋ง๊ฒ ๋๋ฉด callback hell์ ๋น ์ง๊ฒ ๋๋ค.
๊ทธ๋ผ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋๋ก ํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ๋ ์ข์์ง๋๊ฑฐ ์๋๊ฐ?
ํ๊ฒ ์ง๋ง ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ํ๋ก๊ทธ๋๋ฐํ๋ฉด ๋ฐ์ดํฐ ์์ฒญ ๋ฐ๋ ๋์ ์ฌ์ฉ์๋ ์๋ต์ด ์ค๊ธฐ ์ ๊น์ง ์๊ฐ๋ฝ ์ชฝ์ชฝ ๋นจ์์ผ ํ๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์ถฐ๋ฒ๋ฆฌ๊ฐ ๋๋ฌธ์ UX์ ํฐ ์ ์ํฅ์ ๋ฏธ์น๋ค. (๋น๋๊ธฐ ๋น๋๊ธฐ ํ๋๋ฐ๋ ์ด์ ๊ฐ ์๋ค!)Promise
async-await
fetch API
this์ ์ค์ง์ ์ฌ์ฉ๋ฒ
์ด๋ก ์ ์ผ๋ก๋ 70~80% ์ ๋ ์ดํดํ ๊ฒ ๊ฐ์ผ๋ ์ค์ ์ฌ์ด๋ ํ๋ก์ ํธ๋ ๊ณผ์ ๋ฅผ ํ๋ฉด์ this๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ์ฒดํฌํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค. ํญ์ this๊ฐ ์ด๋๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋์ง ํ์ธํ์ฌ ์ฝ๋ฉํ๋ ์ต๊ด์ ๋ค์ฌ๋๊ฐ ๊ฒ์ด๋ค.
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ ์ฉ
๋ง์ฐฌ๊ฐ์ง๋ก ์์ผ๋ก ์งํํ ๊ณผ์ ๋ ํ๋ก์ ํธ์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํ์ฌ ์ฝ๋ฉ์ ํด๋ณด๋ ค๊ณ ํ๋ค. ํ์ฌ 3์ฃผ์ฐจ ๊ณผ์ ์ ์ ์ฉํด๋ณด์๋๋ฐ ์๊ฐ๋ณด๋ค ์ต์ํด์ง๋ ํฌ๊ฒ ์ด๋ ต์ง๋ ์์๋ค.
LocalStorage ์ฌ์ฉ๋ฒ
๋จ์ํ
setItem
,getItem
,clear
๋ฉ์๋๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ค๋ง ์์๋ค. ๊ฐ์ฌ๋์ด ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ฅผ ๋ฐ๋ก ํ์ผ๋ก ๋ง๋ค์ด ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ ์งํํ๋๋ก ๋ถ๊ธฐํ๋ ๊ฒ์ ๋ณด๊ณ ์คํ ๋ฆฌ์ง๋ฅผ ๋ชจ๋ํํ์ฌ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ์์ผ๋ก ํ๋ก์ ํธ์์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ ๋ค๋ฃฐ ๋๋ ๋ฐ๋ก ๋ชจ๋ํํ์ฌ ์ฌ์ฉํด์ผ๊ฒ ๋ค.
- JavaScript ์ฌ์ ํด์ฆ๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ง๋ฉด์ ์ค์ํ ๋งํ ํฌ์ธํธ๋ฅผ ์ง์ด ๋ณด์๊ณ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์ ์์ ๊ทธ ์ฐจ์ด์ ์ ์ ์์์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ๋๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์์ฐ์ฑ์ ๋์ผ ์ ์๋๋ก ์ต๊ด์ ๋ค์ฌ์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
- Local Storage ๋ฐ ๋ชจ๋ํ ์ฌ์ฉ๋ฒ, ๋น๋๊ธฐ ํ๋ก์ธ์ค์ ๋ํด ๋ฐฐ์ ๋ค.
๋น๋๊ธฐ ์์ ์ํ์ ์ํ Promise, async-await, fetch api์ ๋ํด ์ค์ Todo List ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๋ฉด์ ๊ณต๋ถํ๋๊น ํจ์ฌ ์ต๋์ด ์ ๋์๋ค.
- ์์ง ๊ฐ์ฌ๋์ด ๊ตฌํํ ์ฝ๋๋ฅผ ๋ฐ๋ผ์น ๊ฒ์ ๋ถ๊ณผํ๋ค๊ณ ์๊ฐํ๊ธฐ์ ์ค์ ์งํํ๊ณ ์๋ ํ ์ฌ์ด๋ ํ๋ก์ ํธ์๋ ์ ์ฉํด๋ณผ ์์ ์ด๋ค. ๋น๋๊ธฐ ํ๋ก์ธ์ค์ ๋ํ ๊ณต๋ถ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ ๊น๊ฒ ํด๋์์ผ ์์ผ๋ก api๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํ ๋ ํค๋ฉ์ง ์์ ๊ฒ ๊ฐ๋ค.
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.
๊ด๋ จ ๋ ํผ๋ฐ์ค
poiemaweb : this
poiemaweb : IIFE