** ๐Ÿ“Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ •์ฒด ์™„์ „ ํ•ด๋ถ€**

๐Ÿ”ฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ž€?

๊ตฌ๋ถ„ ๋‚ด์šฉ
๐Ÿงฌ ์–ธ์–ด ํƒ€์ž… ์ธํ„ฐํ”„๋ฆฌํ„ฐ, ๋™์  ํƒ€์ดํ•‘, ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ
๐ŸŒ ์—ญํ•  ์›น ๋ธŒ๋ผ์šฐ์ € ์ œ์–ด, ์„œ๋ฒ„(Node.js), ์•ฑ
๐Ÿ•น๏ธ ์—”์ง„ V8(Chrome), SpiderMonkey(Firefox)
๐Ÿงฉ ํŠน์ง• ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜, ๋น„๋™๊ธฐ, ๊ฐ์ฒด ๊ธฐ๋ฐ˜

๐Ÿ” ์‹ฌํ™” ๋น„์œ :

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ = ์ž๋™์ฐจ์˜ ์กฐ์ข…์„

๐Ÿš— HTML: ์ฐจ์ฒด, CSS: ๋””์ž์ธ, JavaScript: ์กฐ์ž‘ (์šด์ „๋Œ€, ํŽ˜๋‹ฌ)


๐Ÿ“Œ 2๏ธโƒฃ ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์‹ฌํ™”

๐Ÿท๏ธ ๋ณ€์ˆ˜ ์„ ์–ธ

ํ‚ค์›Œ๋“œ ํŠน์ง•
var ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ… O
let ๋ธ”๋ก ์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ… O(์ดˆ๊ธฐํ™” X)
const ์ƒ์ˆ˜, ๋ธ”๋ก ์Šค์ฝ”ํ”„, ์žฌํ• ๋‹น ๋ถˆ๊ฐ€
console.log(a); // undefined, var ํ˜ธ์ด์ŠคํŒ…
var a = 10;

๋ฉด์ ‘ ํฌ์ธํŠธ:

let, const๊ฐ€ TDZ(Temporal Dead Zone)์— ๋น ์ง€๋Š” ์ด์œ  โ†’ ์ดˆ๊ธฐํ™” ์ „ ์ฐธ์กฐ ๊ธˆ์ง€


๐Ÿ”ข ์ž๋ฃŒํ˜• ์‹ฌํ™”

๐Ÿ” ์‹ฌํ™” ํฌ์ธํŠธ:


๐Ÿ”ฅ 3๏ธโƒฃ ์—ฐ์‚ฐ์ž, ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ์‹ฌํ™”

๐Ÿš€ ์—ฐ์‚ฐ์ž ์‹ฌํ™”

const user = null;
const name = user && user.name; // user๊ฐ€ null์ด๋ฉด ํ‰๊ฐ€ ์ค‘๋‹จ

๐ŸŽฏ ์กฐ๊ฑด๋ฌธ ์‹ฌํ™”


๐Ÿ” ๋ฐ˜๋ณต๋ฌธ ์‹ฌํ™”

๋ฐ˜๋ณต๋ฌธ ํŠน์„ฑ
for ์ธ๋ฑ์Šค ์ ‘๊ทผ
for...in ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ
for...of iterable ์ˆœํšŒ
.forEach() ๋ฐฐ์—ด ์ˆœํšŒ, break ๋ถˆ๊ฐ€

๐Ÿงฉ 4๏ธโƒฃ ํ•จ์ˆ˜ ์‹ฌํ™”: ์ง„์งœ ํ•จ์ˆ˜ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

๐Ÿ’ก ํ•จ์ˆ˜ 4์ข… ์™„๋ฒฝ ๋น„๊ต

  1. ํ•จ์ˆ˜ ์„ ์–ธ์‹ โ†’ ํ˜ธ์ด์ŠคํŒ… O
  2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹ โ†’ ํ˜ธ์ด์ŠคํŒ… X
  3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ โ†’ this ๋ฐ”์ธ๋”ฉ X
  4. IIFE (์ฆ‰์‹œ ์‹คํ–‰)

๐Ÿ”ฅ ์ฝœ๋ฐฑ, ํด๋กœ์ €, ๊ณ ์ฐจ ํ•จ์ˆ˜

function outer() {
  let count = 0;
  return function inner() {
    count++;
    console.log(count);
  };
}
const counter = outer();
counter(); // 1
counter(); // 2

๐ŸŒ 5๏ธโƒฃ ๊ฐ์ฒด(Object)์™€ ํ”„๋กœํ† ํƒ€์ž… ์‹ฌํ™”

๐Ÿ“ฆ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด โ†’ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ โ†’ ํด๋ž˜์Šค

function Person(name) {
  this.name = name;
}
Person.prototype.sayHi = function() {
  console.log(`Hi ${this.name}`);
};

๐ŸŒŸ ์‹ฌํ™”:


๐Ÿš€ 6๏ธโƒฃ ์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ…, this, ํด๋กœ์ € ์ดˆ๊ณ ๊ธ‰ ์ •๋ฆฌ

๊ฐœ๋… ์„ค๋ช…
Lexical Scope ์„ ์–ธ๋œ ์œ„์น˜ ๊ธฐ์ค€ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •
ํ˜ธ์ด์ŠคํŒ… ์„ ์–ธ๋งŒ ๋Œ์–ด์˜ฌ๋ฆผ, ์ดˆ๊ธฐํ™”๋Š” X
this ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ • (๋ฉ”์†Œ๋“œ, ์ƒ์„ฑ์ž, call/apply/bind)
ํด๋กœ์ € ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ณ€์ˆ˜ ๊ธฐ์–ต, GC์— ์žกํžˆ์ง€ ์•Š์Œ

๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ:

โ€œthis๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋ ๊นŒ?โ€


โš™๏ธ 7๏ธโƒฃ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ฌํ™”

๋ฐฉ์‹ ํŠน์ง•
์ฝœ๋ฐฑ ๋‹จ์ˆœํ•˜์ง€๋งŒ Callback Hell ๋ฌธ์ œ
ํ”„๋กœ๋ฏธ์Šค then, catch, finally
async/await ๊ฐ€๋…์„ฑ ์ข‹๊ณ  try-catch ๊ฐ€๋Šฅ
async function getData() {
  try {
    const res = await fetch('url');
    const data = await res.json();
  } catch (e) {
    console.error(e);
  }
}

๐Ÿ–ฑ๏ธ 8๏ธโƒฃ DOM ์กฐ์ž‘๊ณผ ์ด๋ฒคํŠธ ์‹ฌํ™”

๐ŸŽฏ ์ด๋ฒคํŠธ ์œ„์ž„ ์‹ค๋ฌด ์˜ˆ์ œ

document.querySelector('#list').addEventListener('click', e => {
  if (e.target.tagName === 'LI') {
    e.target.classList.toggle('active');
  }
});

๐Ÿ“ฆ 9๏ธโƒฃ ES6+ ์‹ฌํ™” (์ง„์งœ ์‹ค๋ฌด์šฉ)

๋ฌธ๋ฒ• ํ™œ์šฉ
ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ${}๋กœ ๋ฌธ์ž์—ด ์กฐ๋ฆฝ
๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ๊ฐ์ฒด/๋ฐฐ์—ด ๋ถ„ํ•ด ๋Œ€์ž…
์Šคํ”„๋ ˆ๋“œ/Rest ๋ฐฐ์—ด/๊ฐ์ฒด ํ™•์žฅ, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ์Œ
๋ชจ๋“ˆ import, export๋กœ ์ฝ”๋“œ ๊ด€๋ฆฌ

๐ŸŽ๏ธ ๐Ÿ”Ÿ ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋””๋ฒ„๊น…, ๋ณด์•ˆ ์‹ฌํ™”


๐Ÿ† 11๏ธโƒฃ ๊ธฐ์ˆ  ๋ฉด์ ‘ & ์‹ค๋ฌด ์ตœ์ข… ๋Œ€๋น„