glowing713
Frontend-Deep-Dive
glowing713
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (97)
    • Languages (11)
      • JavaScript πŸ’› (3)
      • Python 🐍 (4)
      • Java β˜•οΈ (3)
      • Swift 🧑 (1)
    • Computer_Science (1)
      • Computer_Network πŸ•Έ (1)
    • Web_Frontend (4)
      • Vue.js (1)
    • Problem_Solving (76)
    • Server (1)
      • Spring πŸ€ (1)
    • AI (2)
      • NLP πŸ—£ (1)
      • AI_Math βž— (1)
    • κ°œλ°œν™˜κ²½ κΎΈλ―ΈκΈ° ✌ (1)
    • 생각정리 ✍🏻 (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸ§‘πŸ»β€πŸ’»Github

곡지사항

인기 κΈ€

νƒœκ·Έ

  • c++
  • Baekjoon
  • Stack
  • 2019 카카였 개발자 겨울 인턴십
  • boostcampaitech
  • Algorithm
  • λ™μ κ³„νšλ²•
  • mst
  • 완전탐색
  • Python
  • ps
  • binary search
  • BOJ
  • 이뢄탐색
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
  • brute-force
  • DP
  • 카카였 기좜
  • bfs
  • Java

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
glowing713

Frontend-Deep-Dive

[JS] λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…(Hoisting)에 λŒ€ν•˜μ—¬
Languages/JavaScript πŸ’›

[JS] λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…(Hoisting)에 λŒ€ν•˜μ—¬

2020. 2. 19. 17:44

1. var 에 λŒ€ν•œ κ°œλ…μ •λ¦¬

 

JavaScript의 var λ³€μˆ˜λŠ” λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό 쑰금 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€. μ΄λŠ” λ•Œλ•Œλ‘œ 개발자둜 ν•˜μ—¬κΈˆ μ˜λ„ν•˜μ§€ μ•Šμ€ κ²°κ³Όλ₯Ό λ°œμƒν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

 

if(true){
   var name = 'sean';
}
console.log(name);

 

for(var i=0; i<5; i++){
   // do something
}
console.log(i);

 

일반적인 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ³€μˆ˜λŠ” 블둝 μŠ€μ½”ν”„ { } μ•ˆμ—μ„œ μœ νš¨ν•˜κΈ° λ•Œλ¬Έμ—, 블둝이 μ’…λ£Œλœ

μ‹œμ μ—μ„œ console.logλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 것이라 μ˜ˆμƒλ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μž…λ ₯ν•œ μ†ŒμŠ€μ½”λ“œμ˜ 결과둜 ‘sean’κ³Ό ‘5’κ°€ μ½˜μ†”μ— μ •μƒμ μœΌλ‘œ 좜λ ₯이 λ©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν˜„μƒμ΄ λ°œμƒν•˜λŠ” μ΄μœ κ°€ λ°”λ‘œ var λ³€μˆ˜κ°€ Hoisting 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

- Hoistingμ΄λž€?

 

Hoisting은 var을 톡해 μ •μ˜λœ λ³€μˆ˜μ˜ 선언문을 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” ν–‰μœ„λ₯Ό λ§ν•©λ‹ˆλ‹€. ‘μ„ μ–Έκ³Ό ν• λ‹Ήμ˜ 뢄리’라고 생각할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

if(true){
   var name = 'sean';
}
console.log(name);

 

μœ„ μ½”λ“œλŠ” Hoisting에 μ˜ν•΄ μ•„λž˜μ™€ 같은 λͺ¨μ–‘μœΌλ‘œ λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.

 

var name;
if(true){
   name = 'sean';
}
console.log(name);

 

var name = ‘sean’이라고 μ •μ˜ν•œ λ³€μˆ˜κ°€ μ‹€μ œλ‘œλŠ” μ„ μ–Έ(var name)κ³Ό ν• λ‹Ή(name = ‘sean’)둜 λΆ„λ¦¬λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 if ꡬ문 λ°–μ—μ„œ name λ³€μˆ˜κ°€ μ‚¬μš© κ°€λŠ₯ν•˜κ³ , for ꡬ문 λ°–μ—μ„œ I λ³€μˆ˜κ°€ μ‚¬μš© κ°€λŠ₯ν•œ ν˜„μƒμ΄ λ°œμƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

- κ·Έλ ‡λ‹€λ©΄ Hoisting μ‹œ 유효 λ²”μœ„ λž€?

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ varλŠ” λ‹¨μˆœν•œ 블둝{ }이 μ•„λ‹Œ ν•¨μˆ˜ 블둝 function{ } μ•ˆμ—μ„œ μœ νš¨ν•©λ‹ˆλ‹€.

이λ₯Ό varλŠ” “ν•¨μˆ˜ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜λ‹€” 라고 ν•©λ‹ˆλ‹€.

 

function func1(){
   if(true){
      var name = 'sean';
   }
   console.log(name);
} 

function func2(){
   for(var i=0; i<5; i++){
      // do something
   }
   console.log(i);
}

if(true){
   var num = 50;
}
console.log(num);

 

μœ„ μ½”λ“œλŠ” Hoisting에 μ˜ν•΄ λ‚΄λΆ€μ—μ„œ μ•„λž˜μ™€ 같은 λͺ¨μ–‘μœΌλ‘œ λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.

 

var num;

function func1(){
   var name;
   if(true){
      name = 'sean';
   }
   console.log(name);
}

function func2(){
   var i;
   for(i=0; i<5; i++){
      // do something
   }
   console.log(i);
}

if(true){
   num = 50;
}
console.log(num);

 

varλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜κΈ° λ•Œλ¬Έμ— Hoisting μ‹œ, 선언문은 κΈ€λ‘œλ²Œ μŠ€μ½”ν”„κ°€ μ•„λ‹Œ 유효 λ²”μœ„(function) λ‚΄λΆ€μ˜ μ΅œμƒλ‹¨μ— μœ„μΉ˜ν•˜κ²Œ λ©λ‹ˆλ‹€.

κΈ€λ‘œλ²Œ μŠ€μ½”ν”„ λ˜ν•œ ν•˜λ‚˜μ˜ ν•¨μˆ˜ μŠ€μ½”ν”„μ²˜λŸΌ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— Hoisting이 μΌμ–΄λ‚©λ‹ˆλ‹€.

 

- ν•¨μˆ˜μ˜ Hoisting?

 

ν•¨μˆ˜μ˜ μ„ μ–Έ μ—­μ‹œ Hoisting의 λŒ€μƒμž…λ‹ˆλ‹€. λ•Œλ¬Έμ— μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ–΄λ–€ μœ„μΉ˜μ—μ„œ ν•¨μˆ˜ 선언을 ν•˜λ“ μ§€ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

sayName();

function sayName(){
   console.log(‘sean’);
}

 

μœ„ μ½”λ“œλŠ” ν•¨μˆ˜ hoisting으둜 인해 μ•„λž˜μ™€ 같은 λͺ¨μ–‘μœΌλ‘œ λ³€ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

function sayName(){
   console.log(‘sean’);
}

sayName();

 

ν•¨μˆ˜ μ„ μ–Έ μ—­μ‹œ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§€κΈ° λ•Œλ¬Έμ— sayName()을 λ¨Όμ € ν˜ΈμΆœν•˜κ³  ν•¨μˆ˜ μ •μ˜λ₯Ό 이후에 ν•˜μ—¬λ„ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

2. var 에 λŒ€ν•œ 문제점

 

ν•™λΆ€μ—μ„œ C, C++, Java, Python λ“±μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό λ°°μš°λ‹€κ°€ JavaScriptλ₯Ό μ ‘ν•˜κ²Œ λ˜λ‹ˆ,

var λ³€μˆ˜κ°€ Function scope λ₯Ό κ°–λŠ” 것에 λŒ€ν•΄ μš°λ €κ°€ μƒκΉλ‹ˆλ‹€. var λ³€μˆ˜μ˜ μš°λ €λ˜λŠ” μ μ—μ„œ λ°œμƒν•˜λŠ” λ¬Έμ œμ λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

 

1) var둜 λ³€μˆ˜ μ„ μ–Έ μ‹œ var ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯

 

chicken = 'nice';
console.log(chicken); // nice

 

var ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•˜λŠ” 선언문을 μž‘μ„±ν•˜μ§€ μ•Šμ•˜μœΌλ‚˜ μ„ μ–Έν•˜μ—¬ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ΄λŠ” 직관적인 μ½”λ“œ 리뷰가 μ–΄λ €μ›Œμ§€λŠ” 문제λ₯Ό μœ λ°œν•©λ‹ˆλ‹€.

 

2) λ³€μˆ˜ μ„ μ–Έ μ „ μ‚¬μš©

 

λ³€μˆ˜ μ„ μ–Έ 전에 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜κ°€ undefined 값을 κ°–λŠ” κ²½μš°μž…λ‹ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ  JavaScriptμ—μ„œλŠ” Hoisting 을 ν•΄μ„œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ 선언이 인터프리터에 μ˜ν•΄ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§‘λ‹ˆλ‹€.

 

for (var i = 0; i < rows.length; i++) {
    var obj = {
        patternId: patternId,
        sortOrder: idx++
    };
    rowOrderArr.push(obj);
}
var patternId = $("#patternNameLabel").attr("patternId");
$.post('/delete.do', { order: JSON.stringify(rowOrderArr) });

 

μœ„ μ½”λ“œμ—μ„œ obj 객체의 patternId 속성은 항상 undefined κ°’μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ λŒλ €λ³΄λŠ” μ‹œμ μ—μ„œμ•Ό 문제λ₯Ό μ•Œ 수 있게 λ©λ‹ˆλ‹€.

κ°€λ Ή rowOrderArr 객체둜 μ„œλ²„μ— AJAX ν˜ΈμΆœμ„ ν–ˆμ„ λ•Œμ—μ•Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

(ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ patternId 값을 μ•ˆ μ±„μ›Œμ€˜μ„œ μ„œλ²„ μ—λŸ¬κ°€ λ‚©λ‹ˆλ‹€.)

 

3) λ³€μˆ˜ 쀑볡 μ„ μ–Έ

 

ν•¨μˆ˜ 내에 μ€‘λ³΅λœ λ³€μˆ˜ 선언이 μ‘΄μž¬ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

 

κ°œλ°œμžλ“€μ΄ λ³€μˆ˜μ˜ λ²”μœ„λ₯Ό 일반적으둜 μƒκ°ν•˜λŠ” λ²”μœ„μΈ λΈ”λŸ­ λ²”μœ„(block scope)둜 μƒκ°ν•˜κ³ 

μ•„λž˜μ™€ 같이 pjtCode λ³€μˆ˜κ°€ 각 λΈ”λŸ­μ— ν•œμ •λ˜κ²Œ μž‘μ„±μ„ ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

var idx = nextUrl.toUpperCase().indexOf('&PJTCODE=');
if (idx > -1){
   var pjtCode = nextUrl.substr(idx + 9, 15);
   if (idx > 9) {
      var pjtCode = 'BAD_CODE';
   }
   console.log(pjtCode);
}
console.log(pjtCode);

 

JavaScriptλŠ” λ³€μˆ˜κ°€ ν•¨μˆ˜ λ²”μœ„(function scope)λ₯Ό κ°€μ§€κ³  Hoisting에 μ˜ν•΄ 선언이 λŒμ–΄μ˜¬λ €μ§€λ―€λ‘œ, μ‹€μ œλ‘œ pjtCode λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ ν•˜λ‚˜λ‘œ μœ μ§€λ©λ‹ˆλ‹€.

즉, 두 개의 μ½˜μ†” 좜λ ₯λ¬Έ λͺ¨λ‘ BAD_CODE둜 좜λ ₯λ©λ‹ˆλ‹€.(idxκ°€ 9보닀 클 경우)

이와 같이 Hoisting은 JavaScript μ½”λ“œ 해석을 λΉ„μ§κ΄€μ μœΌλ‘œ λ§Œλ“œλŠ” 츑면이 μžˆμŠ΅λ‹ˆλ‹€.

 

4) λ³€μˆ˜ μž¬μ •μ˜

 

λ³€μˆ˜λ₯Ό μž¬μ •μ˜ν•¨μœΌλ‘œμ¨ 이전에 μ •μ˜ν•œ λ³€μˆ˜κ°€ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” κ²½μš°μž…λ‹ˆλ‹€.

 

if ($.browser.msie == true) {
   target = url + "userName" + userName; // 1)
   target = url.replace(/\.|\?|\&|\/|\=|\:|\-|\s/gi,""); // 2)
}

 

μœ„ μ½”λ“œμ—μ„œ 1)에 μ •μ˜λœ target λ³€μˆ˜κ°€ 2)μ—μ„œ μž¬μ •μ˜λ˜λ©΄μ„œ 1)μ—μ„œ ν• λ‹Ήν•œ username νŒŒλΌλ―Έν„°κ°€ λ¬΄μ‹œλ©λ‹ˆλ‹€. λ”°λΌμ„œ μ˜λ„ν•œ λŒ€λ‘œ κ²°κ³Όλ₯Ό μ–»μœΌλ €λ©΄ λ‹€μŒκ³Ό 같이 μˆ˜μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

if ($.browser.msie == true) {
   target = url + "userName" + userName;
   target = target.replace(/\.|\?|\&|\/|\=|\:|\-|\s/gi,"");
}

 

3. λ¬Έμ œμ μ— λŒ€ν•œ ν•΄κ²°λ°©μ•ˆ

 

ES6(ECMAScript 6th edition, λ§€ λ…„ λ°œν‘œν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€) μ΄μ „μ—λŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법이 var λ₯Ό μ΄μš©ν•˜λŠ” 방법 밖에 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 것과 같은 μ—¬λŸ¬κ°€μ§€ λ¬Έμ œλ“€μ΄ λ°œμƒν–ˆκ³ , ES6μ—μ„œ μΆ”κ°€λœ let, const λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 문제λ₯Ό ν•΄κ²°ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

1) block-level-scope variable(let, const)

 

Var λŠ” function-level-scope λΌμ„œ μ „μ—­ λ³€μˆ˜κ°€ λ‚¨λ°œν•˜λŠ” λ¬Έμ œλ“€μ΄ λ§Žμ•˜μœΌλ‚˜,  let, const λŠ” block-level-scope λΌμ„œ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

let chicken = 'nice'; // μ „μ—­ λ³€μˆ˜
{
   // ReferenceError: chicken is not defined
   console.log(chicken);
   let chicken = 'nice';
   console.log(chicken); // good
}

 

2) λ³€μˆ˜ 쀑볡 μ„ μ–Έ λΆˆκ°€

 

Var μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μœ„μ— μ„ μ–Έ ν›„ λ‹€μ‹œ μ•„λž˜μ—μ„œ μž¬μ„ μ–Έμ΄ κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ let, const λŠ” μž¬μ„ μ–Έ μ‹œ 문법 μ—λŸ¬κ°€ λœΉλ‹ˆλ‹€.

 

let chicken = 'nice'; // μ „μ—­ λ³€μˆ˜
{
   // Identifier ‘chicken’ has already been declared
   let chicken = 'good';
}

 

3) ν˜Έμ΄μŠ€νŒ… λΆˆκ°€

 

μœ„μ—μ„œ μ„€λͺ…ν–ˆλ“―이 var둜 λ³€μˆ˜ 생성 μ‹œ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— 이루어지기 λ•Œλ¬Έμ— Hoisting ν˜„μƒμ΄ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ let, const λŠ” λ³€μˆ˜ 생성 μ‹œ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λΆ„λ¦¬λ˜μ–΄μ„œ 진행이 λ©λ‹ˆλ‹€. let, const λŠ” λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³  μ„ μ–ΈκΉŒμ§€ ν•œ ν›„ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€κ°€ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” 사이에 생기며, ν• λ‹Ήλ¬Έμ—μ„œ λ³€μˆ˜ 값이 ν• λ‹Ή 될 λ•Œ μ΄ˆκΈ°ν™” 및 κ°’ 할당이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

// error: chicken is not defined
Console.log(chicken);
let chicken = 'nice';

 

μ •λ¦¬ν•˜μžλ©΄, ES6 λ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜λ‹€λ©΄ var λŒ€μ‹  let, constλ₯Ό μ‚¬μš©ν•˜λ©΄ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let 으둜 λ³€μˆ˜ μ„ μ–Έ ν›„ 값을 μž¬ν• λ‹Ή κ°€λŠ₯ν•˜μ§€λ§Œ, const 둜 μ„ μ–Έ ν›„ 값을 μž¬ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 값을 μž¬ν• λ‹Ή ν•  것 κ°™μœΌλ©΄ let을 μ‚¬μš©ν•˜κ³  λ³€ν•˜μ§€ μ•ŠλŠ” κ°’μ—λŠ” const(μƒμˆ˜)λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

4. μ°Έκ³  μ‚¬μ΄νŠΈ

 

- μžλ°”μŠ€ν¬λ¦½νŠΈ ν˜Έμ΄μŠ€νŒ…(Hoisting)

(https://yuddomack.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85Hoisting)

- varλ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒν•˜λŠ” λ¬Έμ œλ“€

(https://www.daleseo.com/js-var-issues/)

- JavaScriptμ—μ„œ λ³€μˆ˜ μ‚¬μš© μ‹œ μ£Όμ˜ν•  점

(https://cimfalab.github.io/deepscan/2016/07/variable-misuse)

- JavaScript let, constλž€? 그리고 μ™œ μ¨μ•Όλ§Œ ν•˜λŠ”κ°€? (ES6)

(https://happycording.tistory.com/entry/let-const-%EB%9E%80-%EC%99%9C-%EC%8D%A8%EC%95%BC%EB%A7%8C-%ED%95%98%EB%8A%94%EA%B0%80-ES6)

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'Languages > JavaScript πŸ’›' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JS] μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλŠ” 이유  (0) 2021.12.07
[JS] μžλ°”μŠ€ν¬λ¦½νŠΈ μ›μ‹œ κ°’κ³Ό 객체(Immutability, Mutability)  (0) 2021.12.06
    'Languages/JavaScript πŸ’›' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JS] μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλŠ” 이유
    • [JS] μžλ°”μŠ€ν¬λ¦½νŠΈ μ›μ‹œ κ°’κ³Ό 객체(Immutability, Mutability)
    glowing713
    glowing713

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”