Post

πŸ₯œ [JavaScript] Frontend κΈ°μˆ λ©΄μ ‘ (Javascript)

ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” ν”„λ‘ νŠΈμ•€λ“œμ˜ 기술 λ©΄μ ‘ 쀑 μžλ°”μŠ€ν¬λ¦½νŠΈμ— λŒ€ν•΄ μ€‘μ μ μœΌλ‘œ λ‹€λ£¨λŠ” νŽ˜μ΄μ§€ μž…λ‹ˆλ‹€.

JavaScript

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 무슨 μ–Έμ–΄μΈκ°€μš”?

Q. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 인터프리터 μ–Έμ–΄μž…λ‹ˆλ‹€. 인터프리터 μ–Έμ–΄λž€ μ½”λ“œλ₯Ό ν•œ 쀄씩 읽고 μ‹€ν–‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” λΈŒλΌμš°μ €λ‚˜ Node.js와 같은 ν™˜κ²½μ—μ„œ 싀행될 λ•Œ, 인터프리터에 μ˜ν•΄ λŸ°νƒ€μž„ μ‹œμ— ν•΄μ„λ˜κ³  μ‹€ν–‰λ©λ‹ˆλ‹€.

this 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ this λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈλ₯Ό 가리킴

1) μ „μ—­ μ»¨ν…μŠ€νŠΈ

μ „μ—­μŠ€μ½”ν”„μ—μ„œ this λŠ” 전역객체λ₯Ό 가리킀며 window 객체λ₯Ό μ˜λ―Έν•¨

2) ν•¨μˆ˜ λ‚΄λΆ€

일반 ν•¨μˆ˜ 호좜 : 일반 ν•¨μˆ˜ λ‚΄μ—μ„œ this λŠ” 전역객체λ₯Ό 가리킴

λ©”μ„œλ“œ 호좜 : 객체의 λ§€μ„œλ“œ λ‚΄μ˜ this λŠ” ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ†ν•œ 객체λ₯Ό 가리킴

μƒμ„±μž ν•¨μˆ˜ : new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체λ₯Ό 가리킴

3) ν™”μ‚΄ν‘œ ν•¨μˆ˜

ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄μ˜ this λŠ” ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ—μ„œ λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ˜ this λ₯Ό μœ μ§€

4) 이벀트 ν•Έλ“€λŸ¬

이벀트 ν•Έλ“€λŸ¬ λ‚΄μ—μ„œ this λŠ” 이벀트λ₯Ό λ°œμƒ μ‹œν‚¨ DOM μš”μ†Œλ₯Ό 가리킴

Callback ν•¨μˆ˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q. λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜μ–΄ νŠΉμ • 이벀트 쑰건이 λ°œμƒ ν–ˆμ„ λ•Œ μ‹€ν–‰ λ˜λŠ” ν•¨μˆ˜

주둜 비동기적인 μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ±°λ‚˜ νŠΉμ •ν•œ 쑰건이 μΆ©μ‘±λ˜μ—ˆμ„ λ•Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©

Callback 지μ˜₯을 ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q. Callback Hell 은 콜백 ν•¨μˆ˜κ°€ μ€‘μ²©λ˜μ–΄ 가독성이 떨어지고 μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μš΄ μ½”λ“œλ₯Ό λ§ν•©λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법은 λŒ€ν‘œμ μœΌλ‘œ 두가지가 μžˆλ‹€.

1) Promise μ‚¬μš©

ν”„λ‘œλ―ΈμŠ€λŠ” 비동기 μž‘μ—…μ˜ μ™„λ£Œ λ˜λŠ” μ‹€νŒ¨μ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체

1
2
3
4
5
6
7
8
9
10
11
12
13
someAsyncFunction()
   .then(result => {
       // 첫 번째 비동기 μž‘μ—… μ™„λ£Œ ν›„ 싀행될 μ½”λ“œ
       return anotherAsyncFunction(result);
   })
   .then(anotherResult => {
       // 두 번째 비동기 μž‘μ—… μ™„λ£Œ ν›„ 싀행될 μ½”λ“œ
       console.log(anotherResult);
   })
   .catch(error => {
       // μ—λŸ¬ λ°œμƒ μ‹œ 싀행될 μ½”λ“œ
       console.error(error);
   });

2) async/await μ‚¬μš©

비동기 μ½”λ“œλ₯Ό λ™κΈ°μ‹μœΌλ‘œ μ‚¬μš©ν•  수 있게 λ³€κ²½ ν•΄μ£ΌλŠ” async/await 을 μ‚¬μš©

1
2
3
4
5
6
7
8
9
async function fetchData() {
   try {
       const result1 = await someAsyncFunction();
       const result2 = await anotherAsyncFunction(result1);
       console.log(result2);
   } catch (error) {
       console.error(error);
   }
}

μ΄λŸ¬ν•œ 방법듀은 콜백 지μ˜₯을 ν”Όν•˜κ³ , 비동기 μ½”λ“œλ₯Ό λ”μš± κ΄€λ¦¬ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€€λ‹€.

μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높이기 μœ„ν•΄ μ μ ˆν•œ 방법을 μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”

Callback κ³Ό Promise 의 차이λ₯Ό μ„€λͺ…ν•˜μ„Έμš”.

Q. μ½œλ°±μ€ 비동기 μž‘μ—…μ˜ μ™„λ£Œλ₯Ό λ‹€λ£¨λŠ” ν•¨μˆ˜ μžμ²΄μ΄μ§€λ§Œ, ν”„λ‘œλ―ΈμŠ€λŠ” 비동기 μž‘μ—…μ˜ κ²°κ³Όλ₯Ό λ‹€λ£¨λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

μ½œλ°±μ€ μ€‘μ²©λ˜κ±°λ‚˜ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλŠ” 콜백 지μ˜₯(callback hell) 문제λ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ, ν”„λ‘œλ―ΈμŠ€λŠ” 체이닝을 톡해 더 읽기 쉽고 μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œλ―ΈμŠ€λŠ” 비동기 μž‘μ—…μ˜ 성곡 및 μ‹€νŒ¨λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆμœΌλ―€λ‘œ μ—λŸ¬ μ²˜λ¦¬κ°€ κ°„νŽΈν•©λ‹ˆλ‹€.

var, const, let 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

varletconst
ν•¨μˆ˜μŠ€μ½”ν”„λΈ”λ‘μŠ€μ½”ν”„λΈ”λ‘μŠ€μ½”ν”„
ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒ, μ„ μ–Έ μ „ μ‚¬μš©ν•΄λ„ 문제 λ°œμƒν•˜μ§€ μ•ŠμŒν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€λ§Œ μ΄ˆκΈ°ν™” μ „κΉŒμ§€ λ³€μˆ˜ μ ‘κ·Ό λΆˆκ°€ν•œλ²ˆ 값이 ν• λ‹Ή 되면 재 ν• λ‹Ή λΆˆκ°€

Event Capturing κ³Ό Event Bubbling 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q.

1) 이벀트 캑쳐링

μ΄λ²€νŠΈκ°€ κ°€μž₯ λ¨Ό λΆ€λͺ¨ μš”μ†Œμ—μ„œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ‹€μ œ νƒ€κ²Ÿ μš”μ†ŒκΉŒμ§€ 이벀트λ₯Ό μ „νŒŒν•˜λŠ” 방식

캑처링 λ‹¨κ³„μ—μ„œλŠ” κ°€μž₯ μƒμœ„μ˜ μš”μ†ŒλΆ€ν„° ν•˜μœ„ μš”μ†Œλ‘œ μ΄λ²€νŠΈκ°€ 전달

이벀트 μΊ‘μ²˜λ§μ€ 이벀트 νƒ€κ²Ÿμ„ μ°ΎκΈ° μœ„ν•΄ μƒμœ„ μš”μ†Œλ“€μ„ 순차적으둜 탐색

이벀트 ν•Έλ“€λŸ¬κ°€ μƒμœ„ μš”μ†Œμ—μ„œλΆ€ν„° 호좜되고 νƒ€κ²Ÿ μš”μ†Œμ— 도달할 λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰

2) 이벀트 버블링

이벀트 버블링은 μ΄λ²€νŠΈκ°€ νƒ€κ²Ÿ μš”μ†Œμ—μ„œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ κ°€μž₯ λ¨Ό λΆ€λͺ¨ μš”μ†ŒκΉŒμ§€ μ „νŒŒλ˜λŠ” 방식

버블링 λ‹¨κ³„μ—μ„œλŠ” νƒ€κ²Ÿ μš”μ†Œμ—μ„œ μ΄λ²€νŠΈκ°€ λ°œμƒν•œ ν›„ μƒμœ„ μš”μ†Œλ‘œ μ΄λ²€νŠΈκ°€ 전달

이벀트 버블링은 이벀트 νƒ€κ²Ÿμ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μš”μ†Œλ‘œ κ³„μ†ν•΄μ„œ 이벀트 ν•Έλ“€λŸ¬κ°€ 호좜

이벀트 ν•Έλ“€λŸ¬μ˜ 싀행이 μ™„λ£Œλœ 후에 μƒμœ„ μš”μ†Œμ˜ 이벀트 ν•Έλ“€λŸ¬κ°€ 호좜

Event delegation 에 λŒ€ν•΄ μ„€λͺ…ν•˜μ„Έμš”.

Q. 이벀트 μœ„μž„μ€ JS μ—μ„œ 이벀트λ₯Ό 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ”λ°

이벀트λ₯Ό μƒμœ„μš”μ†Œμ—μ„œ ν•˜μœ„μš”μ†Œλ‘œ μ „νŒŒμ‹œμΌœμ„œ μ²˜λ¦¬ν•  수 있음

κ°œλ³„μ μœΌλ‘œ λ“±λ‘ν•˜λŠ” 것 보닀 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이고 μ„±λŠ₯을 ν–₯상 μ‹œν‚¬ 수 있음

κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜λ©΄ μƒμœ„ component 에 이벀트λ₯Ό 등둝해두면 ν•˜μœ„ component 에 μžλ™μœΌλ‘œ λ“±λ‘λ˜λŠ” κ±Έ 말함

1
2
3
4
5
6
<ul onClick={onMove} id="list">
 <li>ITEM 1</li>
 <li>ITEM 2</li>
 <li>ITEM 3</li>
</ul> 
<!-- li λ₯Ό 클릭해도 onMove κ°€ λ™μž‘ν•¨ -->

ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ³  λ°œμƒν•˜λŠ” 이유λ₯Ό μ„€λͺ…ν•˜μ„Έμš”.

Q. ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 이유

JavaScript μ—μ„œ 컴파일 κ³Όμ •μ—μ„œ λ³€μˆ˜ 및 ν•¨μˆ˜ 선언이 μ²˜λ¦¬λ˜λŠ” 방식 λ–„λ¬Έ

μ½”λ“œκ°€ μ‹€ν–‰ 되기 전에 Javascript 엔진은 μ½”λ“œλ₯Ό 선언단계와 μ‹€ν–‰λ‹¨κ³„λ‘œ λ‚˜λˆ”

μ„ μ–Έ λ‹¨κ³„μ—μ„œ λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜κ³  μ‹€ν–‰λ‹¨κ³„μ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰

1
2
console.log(x); // undefined
var x = 10;
1
2
3
4
sayHello(); // "Hello, world!"
function sayHello() {
   console.log("Hello, world!");
}
1
2
3
4
sayHello(); // TypeError: sayHello is not a function
var sayHello = function() {
   console.log("Hello, world!");
}

μœ„μ˜ μ½”λ“œμ—μ„œλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜μ˜€λŠ”λ°

λ³€μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ ν•¨μˆ˜κ°€ ν• λ‹Ήλ˜κΈ° 전에 ν˜ΈμΆœν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

ν΄λ‘œμ €μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q. ν΄λ‘œμ €(closure)λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½(lexical environment)의 μ‘°ν•©

ν•¨μˆ˜κ°€ μ„ μ–Έ 될 λ‹Ήμ‹œμ˜ ν™˜κ²½μ„ κΈ°μ–΅ν•˜κ³  이후 ν•΄λ‹Ή ν•¨μˆ˜κ°€ 호좜 될 λ•Œμ—λ„ κ·Έ ν™˜κ²½μ— μ ‘κ·Ό ν•  수 있게 ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μžμ‹ μ΄ μ„ μ–Έλœ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ“€μ— μ ‘κ·Ό ν•  수 있게 함

1) λ‚΄λΆ€ν•¨μˆ˜μ™€ μ™ΈλΆ€ν•¨μˆ˜μ˜ μ‘°ν•©

λ‚΄λΆ€ν•¨μˆ˜κ°€ μ™ΈλΆ€ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λ˜κ³ , μ™ΈλΆ€ν•¨μˆ˜κ°€ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  λ•Œ ν΄λ‘œμ €κ°€ 생성

2) μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜ μ ‘κ·Ό

ν΄λ‘œμ € λ‚΄λΆ€ν•¨μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ“€μ— μ ‘κ·Ό ν•  수 있음

3) λ ‰μ‹œμ»¬ μŠ€μ½”ν•‘

ν΄λ‘œμ €λŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν•‘μ„ λ”°λ₯΄λ―€λ‘œ ν•¨μˆ˜κ°€ μ–΄λ””μ„œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ μ–΄λ””μ„œ μ ‘κ·Ό λ˜μ—ˆλŠ”μ§€μ— 따라

μ™ΈλΆ€λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 있음

주둜 ν΄λ‘œμ €λŠ” 비동기 처리, 프라이빗 λ³€μˆ˜ 및 λ©”μ„œλ“œ κ΅¬ν˜„, λͺ¨λ“ˆ νŒ¨ν„΄μ— μ‚¬μš© 됨

1
2
3
4
5
6
7
8
9
10
11
12
function outerFunction() {
   let outerVariable = 'I am outer!';
   
   function innerFunction() {
       console.log(outerVariable);
   }
   
   return innerFunction;
}

let inner = outerFunction();
inner(); // 좜λ ₯: "I am outer!"

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ innerFunction 은 outerFunction λ‚΄λΆ€μ—μ„œ μ •μ˜λ˜μ—ˆκ³ ,

μ™ΈλΆ€ λ³€μˆ˜ outerVariable 에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. outerFunction 이 μ‹€ν–‰λœ 후에도

innerFunction 을 λ°˜ν™˜ν•˜μ—¬ ν΄λ‘œμ €κ°€ μƒμ„±λ˜κ³ , 이후에 inner λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

동기와 비동기에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

Q.

동기 (Synchronous)

  • 동기적인 μ½”λ“œλŠ” 순차적으둜 진행
  • 각 μž‘μ—…μ΄ 이전 μž‘μ—…μ΄ μ‹€ν–‰ 된 이후에 순차적으둜 μ‹€ν–‰ 됨

비동기 (Asynchronous)

  • 비동기적인 μ½”λ“œλŠ” 순차적으둜 μ§„ν–‰λ˜μ§€ μ•Šκ³  μ—¬λŸ¬μž‘μ—…μ΄ λ™μ‹œμ— μ‹€ν–‰
  • ν•œ μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ΄ μ€‘λ‹¨λ˜μ§€ μ•ŠμŒ
  • ν•΄λ‹Ή μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šμ•„λ„ λ‹€μŒ μž‘μ—…μ΄ μ‹œμž‘ 됨
  • 일반적으둜 비동기 μ½”λ“œλŠ” Callback, Promise, async/await λ₯Ό μ‚¬μš©ν•˜μ—¬ μ™„λ£Œμ²˜λ¦¬
This post is licensed under CC BY 4.0 by the author.