wam
w__am ๊ฐœ๋ฐœ๋…ธํŠธ
wam
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (165)
    • CS ์ง€์‹ (10)
      • ์ž๋ฃŒ๊ตฌ์กฐ (0)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ์šด์˜์ฒด์ œ (0)
      • ๋„คํŠธ์›Œํฌ (7)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
      • ๋””์ž์ธ ํŒจํ„ด (3)
    • Frontend (131)
      • Three.js (64)
      • NPM (1)
      • Nest.js (19)
      • React (10)
      • Apollo (7)
      • TypeScript (2)
      • JavaScript (12)
      • HTML, CSS (1)
      • Jest (3)
      • E2E (5)
      • Cypress (7)
    • Database (12)
      • TypeORM (12)
    • IT ์ง€์‹ (8)
      • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค (3)
      • ๋„คํŠธ์›Œํฌ (1)
      • ๋ฐ์ดํ„ฐ ํฌ๋งท (2)
      • ๊ธฐํƒ€ (2)
    • IT Book (2)
    • ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก
  • ๐Ÿฑ Github

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • Decorators
  • axeshelper
  • ์ดˆ๊ธฐ ํ™˜๊ฒฝ์„ค์ •
  • joi ์—๋Ÿฌ
  • ์Šค์ฝ”ํ”„
  • ์˜คํ”„-ํ”„๋ ˆ๋ฏธ์Šค(off-premise) ๋ฐฉ์‹
  • Interface
  • type-graphql
  • ๋””์ž์ธ ํŒจํ„ด
  • ํ•จ์ˆ˜์˜ ๋ฒ”์œ„
  • e.preventdefault()
  • react ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • getdelta()
  • math.cos()
  • reactive variables
  • mapped types
  • three.js ๊ตฌ์„ฑ ์š”์†Œ
  • threejs ๊ฐœ๋ฐœ ํ•  ๋•Œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
  • ์›ํ˜•์ ์ธ ์›€์ง์ž„
  • ์‚ผ๊ฐํ•จ์ˆ˜
  • ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • API
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  • getelapsedtime()
  • ๋ฐ์ดํ„ฐ ํฌ๋งท
  • math.sin()
  • gridhelper
  • isabstract
  • ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด

์ตœ๊ทผ ๊ธ€

๊ด€๋ฆฌ์ž

๊ธ€์“ฐ๊ธฐ / ์Šคํ‚จํŽธ์ง‘ / ๊ด€๋ฆฌ์žํŽ˜์ด์ง€
hELLO ยท Designed By ์ •์ƒ์šฐ.
wam

w__am ๊ฐœ๋ฐœ๋…ธํŠธ

ํด๋กœ์ €
Frontend/JavaScript

ํด๋กœ์ €

2024. 4. 13. 22:00
๐Ÿ’ก ํด๋กœ์ €๋Š” ์Šค์ฝ”ํ”„์™€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์žˆ์œผ๋ฉด ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

๐Ÿ’ก  ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋‹ค.

๐Ÿ’ก  ํด๋กœ์ €๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜๋ณด๋‹ค ์ค‘์ฒฉํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๊ณ  ์ด๋ฏธ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์–ด๋–ค ์‹๋ณ„์ž๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๋‹ค.

- ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ํด๋กœ์ €์˜€์ง€๋งŒ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ผ์ฐ ์†Œ๋ฉธ๋˜๋ฉด ํด๋กœ์ €์˜ ๋ณธ์งˆ์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

ํด๋กœ์ €

  • ํ•จ์ˆ˜ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํŠน์„ฑ์ด๋‹ค.
  • MDN์—์„œ์˜ ์ •์˜ : ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋‹ค.

 

 

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(= ์ •์  ์Šค์ฝ”ํ”„)

const x = 1;

function foo() {
  const x = 10;

  // ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ์ •์˜ ํ™˜๊ฒฝ(์œ„์น˜)์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค.
  // ํ•จ์ˆ˜ ํ˜ธ์ถœ ์œ„์น˜์™€ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค.
  bar();
}

// ํ•จ์ˆ˜ bar๋Š” ์ž์‹ ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„
// ์ฆ‰ ์ „์—ญ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ [[Environment]]์— ์ €์žฅํ•˜์—ฌ ๊ธฐ์–ตํ•œ๋‹ค.
function bar() {
  console.log(x); // 1
}

// foo์™€ bar์€ ๋ชจ๋‘ ์ „์—ญ ํ•จ์ˆ˜๋‹ค.
foo(); // 1
bar(); // 1

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

 

ํด๋กœ์ €์™€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

const x = 1;

function outer() {
  const x = 10;
  const inner = function() { console.log(x); };
  return inner;
}

// outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const innerFunc = outer();
innerFunc(); // 10

์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ

์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค.

์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜๋“  ์ƒ๊ด€์—†์ด ์œ ์ง€๋˜๋ฉฐ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ  ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

const x = 1;

function outerFunc() {
	const x = 10;
	innerFunc();
}

function innerFunc() {
	console.log(x); // 1
}

outerFunc(); // 1

 

 

์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์–ด๋–ค ์‹๋ณ„์ž๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
  <body>
    <script>
      function foo() {
        const x = 1;
        const y = 2;

        // ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋กœ์ €๋ผ๊ณ  ํ•˜์ง€ ์•Š๋Š”๋‹ค.
        function bar() {
          const z = 3;

          debugger;
          // ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
          console.log(z);
        }

        return bar;
      }

      const bar = foo();
      bar();
    </script>
  </body>
</html>

 

 

์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ํด๋กœ์ €์˜€์ง€๋งŒ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ผ์ฐ ์†Œ๋ฉธ๋˜๋ฉด ํด๋กœ์ €์˜ ๋ณธ์งˆ์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

<!DOCTYPE html>
<html>
  <body>
    <script>
      function foo() {
      	const x = 1;
      
      	// bar ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์˜€์ง€๋งŒ ๊ณง๋ฐ”๋กœ ์†Œ๋ฉธํ•œ๋‹ค.
      	// ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋กœ์ €๋ผ๊ณ  ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      	function bar() {
      		debugger;
      		// ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
      		console.log(x);
      	}
      	bar();
      }
      
      foo();
    </script>
  </body>
</html>

 

 

์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๊ณ  ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ํด๋กœ์ €์ด๋‹ค.

์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž ์ค‘์—์„œ ๊ธฐ์–ตํ•ด์•ผ ํ•  ์‹๋ณ„์ž๋งŒ ๊ธฐ์–ตํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <body>
    <script>
      function foo() {
        const x = 1;
        const y = 2;

        // ํด๋กœ์ €
        // ์ค‘์ฒฉ ํ•จ์ˆ˜ bar๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋ฉฐ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
        function bar() {
          debugger;
          console.log(x);
        }
        return bar;
      }

      const bar = foo();
      bar();
    </script>
  </body>
</html>

 

 

ํด๋กœ์ €์˜ ํ™œ์šฉ

  • ํด๋กœ์ €๋Š” ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

 

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์€๋‹‰๋œ ๋ณ€์ˆ˜๋‹ค.

const counter= (function(){
  // ์นด์šดํŠธ ์ƒํƒœ ๋ณ€์ˆ˜
  let num = 0;
  
  // ํด๋กœ์ €์ธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  // ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  // ๋”ฐ๋ผ์„œ ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋“ค์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋‹ค.
  return {
    // num: 0, // ํ”„๋กœํผํ‹ฐ๋Š” publicํ•˜๋ฏ€๋กœ ์€๋‹‰๋˜์ง€ ์•Š๋Š”๋‹ค.
    increase() {
      return ++num;
   },
    decrease() {
      return num > 0 ? --num : 0;
    }
  };
}());

console.log(counter.increase()); // 1
console.log(counter.increase()); // 2

console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์€๋‹‰๋œ ๋ณ€์ˆ˜๋‹ค.

 

 

๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๊ฒŒ ๋˜๋ฉด ์ž์œ  ๋ณ€์ˆ˜ ๊ฐ’์ด ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.

// ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ด ํ•จ์ˆ˜๋Š” ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function makeCounter(aux) {
  // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
  let counter = 0;

  // ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜
  return function () {
    // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„์ž„ํ•œ๋‹ค.
    counter = aux(counter);
    return counter;
  };
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function increase(n) {
  return ++n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function decrease(n) {
  return --n;
}

// ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
// makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const increaser = makeCounter(increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

// increaser ํ•จ์ˆ˜์™€๋Š” ๋ณ„๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์นด์šดํ„ฐ ์ƒํƒœ๊ฐ€ ์—ฐ๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. 
const decrease = makeCounter(decrease); 
console.log(decrease()); // -1
console.log(decrease()); // -2
  • makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ด๋‹ค.
  • ์ด ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ makeCounter ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์†ํ•œ counter ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋‹ค.
  • ์ฃผ์˜) makeCounter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ
  • increaser์— ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด makeCounter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„ makeCounter ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์†Œ๋ฉธ๋˜์ง€๋งŒ,
  • decreaser์— ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ makeCounter๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด makeCounter ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ฐ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค์–ด์•ผ ์ž์œ  ๋ณ€์ˆ˜ ๊ฐ’์ด ์—ฐ๋™๋œ๋‹ค.

// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ด ํ•จ์ˆ˜๋Š” ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const counter = (function () {
  // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
  let counter = 0;
    
  // ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜
  return function (aux) {
    // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„์ž„ํ•œ๋‹ค.
    counter = aux(counter);
    return counter;
  };
}());

// ๋ณด์กฐ ํ•จ์ˆ˜
function increase(n) {
  return ++n;
}
// ๋ณด์กฐ ํ•จ์ˆ˜
function decrease(n) {
  return --n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœ
console.log(counter(increase)); // 1 
console.log(counter(increase)); // 2

// ์ž์œ  ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
console.log(counter(decrease)); // 1 
console.log(counter(decrease)); // 0

 

 

์บก์Аํ™”์™€ ์ •๋ณด ์€๋‹‰

์บก์Аํ™”๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ์ •๋ณด ์€๋‹‰ : ์บก์Аํ™”๋Š” ๊ฐ์ฒด์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ถœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ
  • ์ •๋ณด ๋ณดํ˜ธ : ์ ์ ˆ์น˜ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ, ์ฆ‰ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด ์€๋‹‰์„ ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

const Person = (function () {
  let _age = 0;

  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  function Person(name, age) {
    this.name = name; // public
    _age = age;
  }

  // ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
  Person.prototype.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };

  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  return Person;
})();

const me = new Person("Lee", 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ชจ๋‘ public ํ•˜๋ฉฐ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค.
  • name ํ”„๋กœํผํ‹ฐ๋Š” ํ˜„์žฌ ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋˜์–ด ์žˆ์–ด ์ž์œ ๋กญ๊ฒŒ ์ฐธ์กฐ ๋ฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • _age ๋ณ€์ˆ˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ private ํ•˜๋„๋ก ์„ค์ •ํ•ด ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์†๋ฐ›์•„ ํ˜ธ์ถœํ•  Person.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„ ํ˜ธ์ถœ๋œ๋‹ค.
  • Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ sayHi ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๋˜์–ด ์†Œ๋ฉธํ•œ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ _age๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €๋‹ค.

 

 

ํ•˜์ง€๋งŒ ์œ„ ์ฝ”๋“œ ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด _age ๋ณ€์ˆ˜์˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

const me = new Person("Lee", 20);
me.sayHi(); // Hi! My name is Lee. I am 20.

const you = new Person("Kim", 30);
you.sayHi(); // Hi! My name is Kim. I am 30.

// _age ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค!
me.sayHi(); // Hi! My name is Lee. I am 30.

์ด๋Š” Person.prototype.sayHi ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋Š” ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ด๋‹ค.

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋•Œ Person.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๋ฅผ [[Environment]]์— ์ €์žฅํ•˜์—ฌ ๊ธฐ์–ตํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์†์„ ํ†ตํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” Person.prototype.sayHi ๋ฉ”์„œ๋“œ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋กœ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๋™์ผํ•œ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ _age ๋ณ€์ˆ˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜

var funcs = [];

for (var i = 0; i < 3; i++) {
  funcs[i] = function () { return i; };
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]());
  // 3
  // 3
  // 3
}
  • 0, 1, 2๋ฅผ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜์ง€๋งŒ 3, 3, 3์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ๊ทธ ์ด์œ ๋Š” var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ i ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ funcs[j]๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „์—ญ ๋ณ€์ˆ˜ i๋ฅผ ์ฐธ์กฐํ•˜์—ฌ 3์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค.

 

 

๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์ˆ˜์ •

var funcs = [];

for (var i = 0; i < 3; i++) {
  funcs[i] = (function (id) {
    return function () {
      return id;
    };
  }(i));
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]());
  // 0
  // 1
  // 2
}
  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜ i์— ํ˜„์žฌ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ๋งค๊ฐœ๋ณ€์ˆ˜ id์— ํ• ๋‹นํ•œ ํ›„ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ข…๋ฃŒ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋ฐ˜ํ™˜๋œ ์ค‘์ฒฉํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €์ด๊ธฐ์— ๋งค๊ฐœ๋ณ€์ˆ˜ id๋Š” ์ž์œ  ๋ณ€์ˆ˜๋กœ์„œ ํ•ด๋‹น ์ค‘์ฒฉ ํ•จ์ˆ˜์— ๋ฌถ์—ฌ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” let์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋” ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ

const funcs = [];

for (let i = 0; i < 3; i++) {
  funcs[i] = function () { return i; };
}

for (let i = 0; i < funcs.length; i++) {
  console.log(funcs[i]());
  // 0
  // 1
  // 2
}

  • for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ๋ฐ˜๋ณต ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค for ๋ฌธ ์ฝ”๋“œ ๋ธ”๋ก์˜ ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ๋งŒ์•ฝ for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก์˜ ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋‹ค.
  • ์ด๋•Œ ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ๋ฐ˜๋ณต ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์‹๋ณ„์ž(for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ ์„ ์–ธํ•œ ์ดˆ๊ธฐํ™” ๋ณ€์ˆ˜ ๋ฐ for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธํ•œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋“ฑ)์˜ ๊ฐ’์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด for ๋ฌธ์ด ๋ฐ˜๋ณต๋  ๋•Œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜์—ฌ ์‹๋ณ„์ž์˜ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.

 

 

  • ์ด์ฒ˜๋Ÿผ let์ด๋‚˜ const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์€ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜๋ณตํ•  ๋‹น์‹œ์˜ ์ƒํƒœ๋ฅผ ๋งˆ์น˜ ์Šค๋ƒ…์ˆ์„ ์ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ €์žฅ
  • ๋‹จ, ์ด๋Š” ๋ฐ˜๋ณต๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์—†๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์ƒ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ๋ฐ˜๋ณต ์งํ›„, ์•„๋ฌด๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

 

 

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ธ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

// ์š”์†Œ๊ฐ€ 3๊ฐœ์ธ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์š”์†Œ๋กœ ์ถ”๊ฐ€
// ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ ํด๋กœ์ €๋‹ค.
const funcs = Array.from(new Array(3), (_, i) => () => i);

// ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ
funcs.forEach(f => console.log(f())); // 0 1 2

์ด ๋ฐฉ๋ฒ•์€ ๋ณ€์ˆ˜์™€ ๋ฐ˜๋ณต๋ฌธ์˜ ์‚ฌ์šฉ์„ ์–ต์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ๊ฐ€๋…์„ฑ์„ ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

 

์ €์ž‘์žํ‘œ์‹œ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Frontend > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ•‘  (0) 2024.05.08
์Šค์ฝ”ํ”„ ์ฒด์ธ  (0) 2024.05.08
์‹คํ–‰ ์ปจํ…์ŠคํŠธ  (0) 2024.03.23
์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด์˜ ๋น„๊ต  (0) 2024.03.14
์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด, ์ดํ„ฐ๋Ÿฌ๋ธ”, ๋ž˜ํผ ๊ฐ์ฒด  (0) 2024.03.13
    'Frontend/JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ•‘
    • ์Šค์ฝ”ํ”„ ์ฒด์ธ
    • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ
    • ์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด์˜ ๋น„๊ต
    wam
    wam

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”