025

๐Ÿ˜‰ ํ—ท๊ฐˆ๋ ธ๋˜ & ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„๋“ค๋งŒ ์ •๋ฆฌํ•˜๋Š” ๋‚˜๋งŒ์˜ TIL
๐Ÿ˜ฏ ๋ชจ๋“  ๊ฐ•์˜ ๋‚ด์šฉ์„ ์ ์ง€ ์•Š์•„์š”!

โ–ถ ์˜ค๋Š˜์˜ ์†Œ๊ฐ์€?
๋Œ€๋ถ€๋ถ„ ์•„๋Š” ๋‚ด์šฉ์ด์–ด์„œ ๋ณต์Šตํ•˜๋Š” ์ฐจ์›์—์„œ ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ผ์ˆ˜๋ก ์ค‘์š”ํ•˜๋‹ค.. ๊ผญ ๊ธฐ์–ตํ•˜๊ธฐ



[1] ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ธŒ๋ผ์šฐ์ €๋ž€?

์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๋กœ์ง์ด ๋Œ์•„๊ฐ€๋Š” ์‹คํ–‰๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ๊ฒŒ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ†ต์‹  / ๋ Œ๋”๋ง / ์Šคํฌ๋ฆฝํŠธ์‹คํ–‰ 3๊ฐ€์ง€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ž€?

โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋Š” UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์˜ ํ•ต์‹ฌ ์—ญ๋Ÿ‰์€

  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
  • UI
  • ๋„คํŠธ์›Œํฌ
  • ๋ณด์•ˆ
  • ๋ธŒ๋ผ์šฐ์ €
  • ๋””์ž์ธ

์œ„ ์—ฌ์„ฏ๊ฐœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



[2] ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ์ž๋ฃŒํ˜•

๋ณ€์ˆ˜ : ๋ณ€ํ•  ์ˆ˜ ์žˆ์–ด์š” (var, let)

์ƒ์ˆ˜ : ๋ณ€ํ•  ์ˆ˜ ์—†์–ด์š”! (const)

ํ•˜์ง€๋งŒ var๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! โ†’ ์ด์œ ๋Š”? ํ˜ธ์ด์ŠคํŒ… ๋•Œ๋ฌธ

์ž๋ฃŒํ˜•์—๋Š” Number, String, Boolean, Object, Array, Function, Undefined, Null์ด ์žˆ์Šต๋‹ˆ๋‹ค.



[3] JS์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ• ๋‹น โ†’ ์‚ฌ์šฉ โ†’ ํ•ด์ œ์˜ 3๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•œ์ •๋˜์–ด ์žˆ์–ด ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.


์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ์˜ โ€˜์ฃผ์†Œโ€™๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ€์ƒ ๋จธ์‹ (Virtual Machine)์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ฐ€์ƒ ๋จธ์‹ ์—๋Š” Heap ์˜์—ญ, Call stack ์˜์—ญ ๋‘ ๊ฐ€์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Heap์€ ์ฐธ์กฐ ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๊ณ 

Call Stack์€ ์›์‹œ ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Garbage Collector๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

ํ˜„๋Œ€์˜ Garbage Collector๋Š” Mark and Sweep Algorithm์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Mark and Sweep Algorithm
โ†’ ๋‹ฟ์„ ์ˆ˜ ์—†๋Š” ์ฃผ์†Œ๋ฅผ ๋”๋Š” ํ•„์š”์—†๋Š” ์ฃผ์†Œ๋กœ ์ •์˜ํ•˜๊ณ  ์ง€์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜



[4] ํ๋ฆ„ ์ œ์–ด

  • Control Flow

์กฐ๊ฑด์ด๋‚˜ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

  • ์กฐ๊ฑด๋ฌธ ํฌ์ธํŠธ

If์ ˆ์—์„œ false ๋ฟ๋งŒ ์•„๋‹Œ undefined, null, 0, NaN, โ€˜โ€™(empty string)๋„ ๊ฑฐ์ง“์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!



[5] ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด

[5-1] ๋ฐฐ์—ด

๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

  • fill : ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋ฉด์„œ ์ดˆ๊ธฐํ™”
 const arr = new Array(10).fill(0);

-> [0,0,0,0,0,0,0,0,0,0]
  • from : ํŠน์ • ๊ทœ์น™์„ ๊ฐ€์ง„ ๊ฐ’๋“ค๋กœ ๋ฐฐ์—ด์„ ์ฑ„์›Œ์š” (ํ•จ์ˆ˜ ์ƒ์„ฑ)
const arr = Array.from(Array(10), function(v, k) {
	return k + 1
});

-> [1,2,3,4,5,6,7,8,9,10]

๋ฐฐ์—ด ๊ฐ’ ์ถ”๊ฐ€/์‚ญ์ œ

  • push/pop : ๋ฐฐ์—ด์˜ ๋๋ถ€๋ถ„์— ๊ฐ’ ์ถ”๊ฐ€/์‚ญ์ œ
  • unshift/shift : ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„์— ๊ฐ’ ์ถ”๊ฐ€/์‚ญ์ œ
  • splice(์‹œ์ž‘ idx, ๋ idx) : ๋ฐฐ์—ด์˜ ํŠน์ • ๋ถ€๋ถ„ ์‚ญ์ œ

๋ฐฐ์—ด ๊ธฐํƒ€ ํ•จ์ˆ˜

  • join : ๋ฐฐ์—ด ์š”์†Œ๋“ค ๋ฌธ์ž์—ด๋กœ ํ•ฉ์น˜๊ธฐ
const arr = [1,2,3];
console.log(arr.join(","));

-> 1,2,3
  • reverse : ๋ฐฐ์—ด ์š”์†Œ ๋’ค์ง‘๊ธฐ
const arr = [1,2,3];
console.log(arr.reverse());

-> [3,2,1]

โ†’ ์›๋ž˜ ์กด์žฌํ•˜๋˜ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋„ reverse ํ›„์˜ ํ˜•ํƒœ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • concat : ๋‘ ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ
const arr = [1,2,3];
const arr2 = [4,5,6];
console.log(arr.concat(arr2));

-> [1,2,3,4,5,6]
  • slice : ๋ฐฐ์—ด ํŠน์ • ๋ถ€๋ถ„ ์ž๋ฅด๊ธฐ
const arr = [1,2,3,4,5];
console.log(arr.slice(2, 4)); // ์‹œ์ž‘ ์ธ๋ฑ์Šค๋Š” ํฌํ•จ, ๋ ์ธ๋ฑ์Šค๋Š” ๋ฏธํฌํ•จ

-> [3,4]

โ†’ ์›๋ž˜ ์กด์žฌํ•˜๋˜ ๋ฐฐ์—ด์— ๋ฏธ๋ฐ˜์˜ (๋ฐ˜์˜์„ ์œ„ํ•ด์„œ๋Š” splice ์ด์šฉ)

๋ฐฐ์—ด ์กฐํšŒ

for - of ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ง๊ด€์ 


[5-2] ๊ฐ์ฒด

๊ฐ์ฒด ์ดˆ๊ธฐํ™”

const obj = {};
const obj2 = new Object();
const obj3 = { key: value };

๊ฐ์ฒด ๊ฐ’ ์ถ”๊ฐ€/์‚ญ์ œ

const obj = { key: "value" };
obj["key2"] = "value2";
obj.key3 = "value3";

delete obj.key2;

๊ฐ์ฒด ๊ฐ’ ์œ /๋ฌด

const obj = { key : "value" };
console.log("key2" in obj);

-> false

ํ‚ค์™€ ๊ฐ’

const obj = { key: "value" };
Object.keys(obj); // key ์ง‘ํ•ฉ
Object.values(obj); // value ์ง‘ํ•ฉ

๊ฐ์ฒด ์กฐํšŒ

for - in ์‚ฌ์šฉ



[6] ์Šค์ฝ”ํ”„์™€ ํด๋กœ์ €

[6-1] ์Šค์ฝ”ํ”„(=์œ ํšจ ๋ฒ”์œ„)

๋ณ€์ˆ˜๊ฐ€ ์–ด๋Š ๋ฒ”์œ„๊นŒ์ง€ ์ฐธ์กฐ๋˜๋Š” ์ง€๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. (Global Scope, Local Scope)

var๋Š” ์™œ?

ํ˜ธ์ด์ŠคํŒ…๋˜์–ด Local Scope๊ฐ€ Global Scope๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ ๋ฐœ์ƒ!

[6-2] ํด๋กœ์ €

ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์‹คํ–‰๋  ๋•Œ์—๋„ ๊ธฐ์–ตํ•œ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

  • ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์€๋‹‰ํ™”)
function count() {
  let i=0;
  for (i=0; i<5; i+=1) {
    setTimeout(function() {
    	console.log(i);
    }, i*100);
  }
}
count();

-> 5 5 5 5 5

๐Ÿ™„ ๋‹ต 0, 1, 2, 3, 4๋ผ๊ณ  ์˜ˆ์ธกํ–ˆ๋˜ ๋‚˜ ๋‚˜์™€..

์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ์‹œ์ ์—๋Š” ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜์–ด

์ƒ์œ„ i ๊ฐ’์€ ์ด๋ฏธ 5๊นŒ์ง€ ์ฆ๊ฐ€ํ•œ ์ƒํƒœ์ด๋‹ˆ 5๊ฐ€ 5๋ฒˆ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE) ์‚ฌ์šฉ
function count() {
  for (var i=0; i<5; i+=1) {
    (function (num) {
      setTimeout(function() {
      console.log(num);
      }, num*100);
    })(i);
  }
}
count();

-> 0 1 2 3 4

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฃจํ”„๋งˆ๋‹ค ํด๋กœ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  1. let ์‚ฌ์šฉ
function count() {
  for (let i = 0; i < 5; i += 1) {
    setTimeout(function () {
      console.log(i);
    }, i * 100);
  }
}
count(); // 0 1 2 3 4

let์€ ๋ธ”๋ก ์ˆ˜์ค€ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ for๋ฌธ ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํ”„๋งˆ๋‹ค ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

for๋ฌธ์ด ํ•œ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๋งˆ๋‹ค ์•ˆ์—์„œ let ๋ณ€์ˆ˜๊ฐ€ ๊ณ„์† ์ƒˆ๋กœ ์ƒ์„ฑ๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!



[7] ํ˜ธ์ด์ŠคํŒ…

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ var ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ โ€˜ํ˜ธ์ด์ŠคํŒ…โ€™์ž…๋‹ˆ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€, ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” ์„ ์–ธ๋“ค์„ ๋ชจ๋‘ ๋Œ์–ด์˜ฌ๋ ค์„œ ํ•ด๋‹น ํ•จ์ˆ˜ ์œ ํšจ ๋ฒ”์œ„์˜ ์ตœ์ƒ๋‹จ์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค!

var๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์—์„œ๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.


Q. ๋งŒ์•ฝ์— ํ•ด๋‹น ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์žˆ์œผ๋ฉด ์‹คํ–‰์ด ๋ ๊นŒ์š”?

func();

function func() {
  // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ
  console.log("hello JS");
}

โ†’ ๋„ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค! ํ•จ์ˆ˜ ์„ ์–ธ์ด ๋งจ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค ์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ฃผ์˜

[1] ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
โ†’ ์Šค์ฝ”ํ”„ ๊ผฌ์ž„ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค

[2] var์„ ์“ฐ๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ†’ ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ var์™€ ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋Š” ์ด์œ ๋Š”, ES5๋กœ ํŠธ๋žœ์Šค์ปดํŒŒ์ผ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
ES6๋ฅผ ์–ด๋””์—์„œ๋“  ์“ธ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์•„์ง ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.




์ถœ์ฒ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures

https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html

์นดํ…Œ๊ณ ๋ฆฌ: ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ