[TIL] 210915

Lee SyongΒ·2021λ…„ 9μ›” 15일
0

TIL

λͺ©λ‘ 보기
28/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. closure(ν΄λ‘œμ €) / μ™ΈλΆ€ ν•¨μˆ˜μ™€ λ‚΄λΆ€ ν•¨μˆ˜ / private variable / μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ / μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ / ν™”μ‚΄ν‘œ ν•¨μˆ˜ / hoisting / 데이터 νƒ€μž… / primitive / reference

πŸ“– ν•™μŠ΅ 자료

  1. μƒν™œμ½”λ”© ν΄λ‘œμ € κ°•μ˜ 1 ~ 4편

  2. 사전 ν•™μŠ΅ κ°€μ΄λ“œ STEP 5 (Hoisting ~ Reference)


πŸ“š 배운 것

Scope


1. closure(ν΄λ‘œμ €)

μƒν™œμ½”λ”© ν΄λ‘œμ € κ°•μ˜ (1 ~ 4편) μ°Έκ³ 
μΆ”κ°€λ‘œ ES2015 μ΄ν›„μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μ°Έκ³ ν•  것

1) μ™ΈλΆ€ ν•¨μˆ˜μ™€ λ‚΄λΆ€ ν•¨μˆ˜

function outter () { // μ™ΈλΆ€ ν•¨μˆ˜ μ„ μ–Έ

  var title = 'coding everybody'; // μ™ΈλΆ€ ν•¨μˆ˜μ— μ •μ˜λ˜μ–΄ μžˆλŠ” μ§€μ—­λ³€μˆ˜
  
  function inner () { // λ‚΄λΆ€ ν•¨μˆ˜ μ„ μ–Έ
    alert(title);
  }
  
  inner (); // λ‚΄λΆ€ ν•¨μˆ˜ 호좜
  
}

outter (); // μ™ΈλΆ€ ν•¨μˆ˜ 호좜

inner()λΌλŠ” λ‚΄λΆ€ ν•¨μˆ˜λŠ” titleμ΄λΌλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ”λ° inner ν•¨μˆ˜ μ•ˆμ—μ„œ 자체적으둜 κ·Έ 값을 찾을 수 μ—†μœΌλ―€λ‘œ ν•œ 단계 μœ„μΈ outter()λΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ°Ύμ•„λ³΄κ²Œ λœλ‹€. μ™ΈλΆ€ ν•¨μˆ˜μ— titleμ΄λΌλŠ” λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ λ‚΄λΆ€ ν•¨μˆ˜μ˜ title λ³€μˆ˜λŠ” κ·Έ 값을 κ°–κ²Œ λœλ‹€.

즉, λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€


2) closure(ν΄λ‘œμ €)λž€?

  • μžμ‹ μ΄ 선언될 λ‹Ήμ‹œμ˜ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ™€ κ·Έ ν™˜κ²½

  • μ™ΈλΆ€ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈμ— μ ‘κ·Όν•  수 μžˆλŠ” λ‚΄λΆ€ ν•¨μˆ˜

  • μ™ΈλΆ€ ν•¨μˆ˜κ°€ μ’…λ£Œλœ 이후에도 λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯

function outter () {

  var title = 'coding everybody';
  // outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ— μ •μ˜λ˜μ–΄ μžˆλŠ” μ§€μ—­λ³€μˆ˜
  
  return function () {
    alert(title);
  }
  // outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” 읡λͺ…μ˜ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό return ν•œλ‹€

}

var inner = outter();
// outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œ κ²°κ³Όλ₯Ό innerλΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€

inner();
// innerλΌλŠ” λ³€μˆ˜μ— 담겨 μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄
// coding everybodyλΌλŠ” ν…μŠ€νŠΈκ°€ 경고창에 좜λ ₯λœλ‹€

μ›λž˜ μ–΄λ–€ ν•¨μˆ˜κ°€ return을 ν•˜λ©΄ κ·Έ ν•¨μˆ˜λŠ” μ’…λ£Œλœλ‹€. 즉, outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜κ°€ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό returnν•˜λ©΄ outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” μ’…λ£Œλœλ‹€.

λ‹€μ‹œ 말해, λ§ˆμ§€λ§‰μ— innerλΌλŠ” λ³€μˆ˜μ— λ‹΄κΈ΄ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” 이미 μ‹€ν–‰λ˜μ–΄(=return λ˜μ–΄) μ’…λ£Œλœ μ΄ν›„μž„μ„ μ•Œ 수 μžˆλ‹€.

μ—¬κΈ°μ„œ innerλΌλŠ” λ³€μˆ˜μ— λ‹΄κΈ΄ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” 것은 alert(title); ꡬ문을 μ‹€ν–‰ν•œλ‹€λŠ” λœ»μ΄λ‹€. 그런데 titleμ΄λΌλŠ” λ³€μˆ˜μ˜ 값은 읡λͺ…μ˜ λ‚΄λΆ€ ν•¨μˆ˜μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•œ 단계 μœ„μΈ outterλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ°Ύμ•„λ³΄κ²Œ λœλ‹€. 즉, λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ™ΈλΆ€ ν•¨μˆ˜λ‘œ 접근을 μ‹œλ„ν•΄ μ„±κ³΅ν•œ 것이닀.

μ •λ¦¬ν•˜λ©΄, ν΄λ‘œμ €λž€ λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•  수 있고, μ™ΈλΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ†Œλ©Έλ  λ•ŒκΉŒμ§€ μ†Œλ©Έλ˜μ§€ μ•ŠλŠ” νŠΉμ„±μ„ μ˜λ―Έν•œλ‹€.


3) private variable

μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§ˆ λ•Œ κ·Έ 정보λ₯Ό μ•„λ¬΄λ‚˜ μˆ˜μ •ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 것

(1) 객체λ₯Ό returnν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜

function factory_movie (title) {
  
  return {
    
    get_title : function () {
      return title;
    },
    
    set_title : function (_title) {
      title = _title;
    }
    
  } // factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” 객체λ₯Ό return ν•œλ‹€
  
}

factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” titleμ΄λΌλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 가진닀. λ§€κ°œλ³€μˆ˜λŠ” κ·Έ ν•¨μˆ˜μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” μ§€μ—­λ³€μˆ˜μ΄λ‹€.

factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λŠ” {객체}λ₯Ό return ν•œλ‹€. κ·Έ κ°μ²΄λŠ” get_titleκ³Ό set_titleμ΄λΌλŠ” 2개의 ν”„λ‘œνΌν‹°λ₯Ό 가지고 μžˆλ‹€.

객체의 get_title ν”„λ‘œνΌν‹°λŠ” titleμ΄λΌλŠ” λ³€μˆ˜λ₯Ό return ν•˜λŠ” 읡λͺ…μ˜ ν•¨μˆ˜λ₯Ό κ°’μœΌλ‘œ 가진닀. 객체의 set_title ν”„λ‘œνΌν‹°λŠ” _titleμ΄λΌλŠ” λ§€κ°œλ³€μˆ˜μ˜ 값을 titleμ΄λΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” ν•¨μˆ˜λ₯Ό κ°’μœΌλ‘œ 가진닀.

get_title λ©”μ„œλ“œμ™€ set_title λ©”μ„œλ“œμ˜ 값인 function () {...} 뢀뢄은 객체에 μ†Œμ†λ˜μ–΄ μžˆμ„ 뿐, λͺ¨λ‘ factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ‚΄λΆ€ ν•¨μˆ˜μ΄λ‹€.

μ΄λŠ” 곧 이 λ‚΄λΆ€ ν•¨μˆ˜λ“€λ„ κ·Έ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ titleμ΄λΌλŠ” 지역 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŒμ„ λœ»ν•œλ‹€.

get_title λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ titleμ΄λΌλŠ” λ³€μˆ˜λ₯Ό return ν•œλ‹€. 그런데 이 titleμ΄λΌλŠ” λ³€μˆ˜μ˜ 값은 읡λͺ…μ˜ λ‚΄λΆ€ ν•¨μˆ˜μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ°Ύμ•„λ³΄κ²Œ λœλ‹€. κ·Έλ ‡κ²Œ λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ titleμ΄λΌλŠ” μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•˜μ—¬ κ·Έ 값을 λ°›μ•„μ˜€κ²Œ λœλ‹€.

set_title λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ _titleμ΄λΌλŠ” λ§€κ°œλ³€μˆ˜μ˜ 값을 titleμ΄λΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€. λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμœΌλ―€λ‘œ μ΄λ ‡κ²Œ titleμ΄λž€ λ³€μˆ˜μ— ν• λ‹Ήλœ _titleμ΄λΌλŠ” λ§€κ°œλ³€μˆ˜μ˜ 값은 μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μΈ title을 λ°”κΎΈκ²Œ λœλ‹€.

(2) λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€

function factory_movie (title) {  
  return {
    get_title : function () {
      return title;
    },
    set_title : function (_title) {
      title = _title;
    }
  }
}

var ghost = factory_movie('Ghost in the shell');
var matrix = factory_movie('Matrix');

console.log(ghost.get_title());
console.log(matrix.get_title());

factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , λ§€κ°œλ³€μˆ˜μ— 각각 'Ghost in the shell'와 'matrix'λ₯Ό 전해쀬닀. μ™ΈλΆ€ ν•¨μˆ˜κ°€ return ν•˜λŠ” 객체λ₯Ό 각각 ghost와 matrixλΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν–ˆλ‹€.

μ΄λ•Œ ghost와 matrixλŠ” λ˜‘κ°™μ€ 객체λ₯Ό λ‹΄κ³  μžˆμ§€λ§Œ, κ·Έ 객체듀이 μ‹€ν–‰λœ μ»¨ν…μŠ€νŠΈλŠ” μ„œλ‘œ λ‹€λ₯΄λ‹€. 즉, 각 κ°μ²΄λ“€μ˜ get_title λ©”μ„œλ“œκ°€ μ ‘κ·Όν•˜λŠ”, μ™ΈλΆ€ ν•¨μˆ˜μ˜ titleμ΄λΌλŠ” λ³€μˆ˜μ— 담겨 μžˆλŠ” 값이 μ„œλ‘œ 닀름을 μ˜λ―Έν•œλ‹€.

(3) closure(ν΄λ‘œμ €)에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ§€μ—­λ³€μˆ˜λŠ” 각각 μœ μ§€λœλ‹€

function factory_movie (title) {  
  return {
    get_title : function () {
      return title;
    },
    set_title : function (_title) {
      title = _title;
    }
  }
}

var ghost = factory_movie('Ghost in the shell');
var matrix = factory_movie('Matrix');

ghost.set_title('κ³΅κ°κΈ°λ™λŒ€'); // ghost 객체의 set_title λ©”μ„œλ“œ 호좜

console.log(ghost.get_title());
console.log(matrix.get_title());

ghost 객체의 set_title λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³ , λ§€κ°œλ³€μˆ˜λ‘œ 'κ³΅κ°κΈ°λ™λŒ€'λ₯Ό μ „ν•΄μ£Όμ—ˆλ‹€.

κ·Έ ν›„, ghost 객체의 get_title λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 값은 'κ³΅κ°κΈ°λ™λŒ€'κ°€ λœ¬λ‹€. κ·ΈλŸ¬λ‚˜ matrix 객체의 get_title λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 값은 μ—¬μ „νžˆ 'matrix'κ°€ λœ¬λ‹€.

μ •λ¦¬ν•˜λ©΄, factory_movie μ™ΈλΆ€ ν•¨μˆ˜λŠ” ghost와 matrixλΌλŠ” 2개의 객체λ₯Ό λ§Œλ“€μ—ˆλ‹€. 이 2개의 객체듀은 각각 μžμ‹ λ“€μ΄ λ§Œλ“€μ–΄μ§„ κ·Έ μ‹œμ μ˜ μ»¨ν…μŠ€νŠΈ 즉, μžμ‹ λ“€μ΄ λ§Œλ“€μ–΄μ§„ κ·Έ μ‹œμ μ—μ„œμ˜ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€. κ·Έ μ§€μ—­λ³€μˆ˜λŠ” 각각 μœ μ§€λ˜κ³  μžˆμœΌλ―€λ‘œ ghost 객체의 set_title을 ν†΅ν•΄μ„œ title λ³€μˆ˜λ₯Ό 'κ³΅κ°κΈ°λ™λŒ€'둜 λ°”κΎΈλŠ” 것은 ghost 객체가 μ ‘κ·Όν•  수 μžˆλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ§Œμ„ λ°”κΎΈλŠ” 것일 뿐, matrix 객체가 μ ‘κ·Όν•  수 μžˆλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ—λŠ” μ•„λ¬΄λŸ° 영ν–₯도 λ―ΈμΉ˜μ§€ λͺ»ν•œλ‹€.

❗ μ™ΈλΆ€ ν•¨μˆ˜κ°€ 싀행될 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μ§€μ—­λ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” closure(ν΄λ‘œμ €)κ°€ μƒμ„±λœλ‹€. λ”°λΌμ„œ ghost와 matrixλŠ” μ„œλ‘œ μ™„μ „νžˆ λ…λ¦½λœ 객체가 λœλ‹€.

πŸ’‘ κ·Έλ ‡λ‹€λ©΄ private variableμ΄λž€?

factory_movieλΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ–΄ μ–΄λ–€ 값을 return ν•˜λ©΄ κ·Έ ν•¨μˆ˜λŠ” μ’…λ£Œλ˜κ³ , μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μΈ title은 factory_movie의 λ‚΄λΆ€ ν•¨μˆ˜μΈ get_titleκ³Ό set_title을 ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 있게 λœλ‹€. μ΄λ•Œ title을 private variable이라고 ν•œλ‹€.

πŸ’‘ private variable이 ν•„μš”ν•œ 이유

데이터λ₯Ό λˆ„κ΅¬λ‚˜ μˆ˜μ •ν•  수 μžˆλ‹€λ©΄ 그만큼 였λ₯˜κ°€ λ‚  κ°€λŠ₯성이 크닀. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ private variable을 μ΄μš©ν•  수 μžˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” titleμ΄λΌλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— get_title ν•¨μˆ˜μ™€ set_title ν•¨μˆ˜λ§Œμ„ μ΄μš©ν•΄μ•Όλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.
이 경우 titleμ΄λž€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜κ°€ μ™ΈλΆ€μ—μ„œ μ–΄λ–»κ²Œ 쓰이든 간에 λ‚΄λΆ€ ν•¨μˆ˜μ—λŠ” 영ν–₯을 쀄 수 μ—†κΈ° λ•Œλ¬Έμ— 데이터λ₯Ό 훨씬 더 μ•ˆμ „ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ‹€.

titleμ΄λΌλŠ” private variable은 set_title을 ν†΅ν•΄μ„œλ§Œ κ·Έ λ³€μˆ˜μ˜ 값을 μˆ˜μ •ν•  수 있고, get_title을 ν†΅ν•΄μ„œλ§Œ κ·Έ λ³€μˆ˜μ˜ 값을 κ°€μ Έμ˜¬ 수 μžˆλ‹€. ([TIL] 210904 δΈ­ 'μ ‘κ·Όμž ν”„λ‘œνΌν‹°' λΆ€λΆ„ 같이 λ³Ό 것)

μ˜ˆμ‹œ

function factory_movie (title) {
  return {
    get_title : function () {
      return title;
    },
    set_title : function (_title) {
      if (typeof _title === 'string') {
        title = _title;
      } else {
        alert('제λͺ©μ€ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.');
      }
    }
  }
}

var ghost = factory_movie('Ghost in the shell');

ghost.set_title(1); // console 창에 경고창이 λœ¬λ‹€
ghost.set_title('κ³΅κ°κΈ°λ™λŒ€');
console.log(ghost.get_title()); // κ³΅κ°κΈ°λ™λŒ€ 

4) closure(ν΄λ‘œμ €)둜 인해 λ°œμƒν•  수 μžˆλŠ” 문제

❗❗❗ λΉ„λ™κΈ°ν•¨μˆ˜λ₯Ό λ°˜λ³΅λ¬Έμ—μ„œ μ‚¬μš©ν•˜λŠ” 방법 μ°Έκ³  ❗❗❗

(1) μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 scriptλ₯Ό μ‹€ν–‰ν•˜λ‹€κ°€ ν•¨μˆ˜λ₯Ό λ§Œλ‚˜λ©΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” ν•¨μˆ˜κ°€ 싀행될 λ•Œμ˜ ν™˜κ²½μ„ μ €μž₯ν•œλ‹€

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžμ‹ λ§Œμ˜ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€

  • μ „μ—­ μ»¨ν…μŠ€νŠΈμ™€ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈκ°€ μžˆλ‹€

  • 각 ν•¨μˆ˜λ³„λ‘œ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈλ₯Ό 가지고 μžˆμ§€λ§Œ, ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈλŠ” ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄μ•Όλ§Œ λ§Œλ“€μ–΄μ§„λ‹€

[ 예제 뢄석 ]

var x = 10;
var y = 20;
function print() {
  var x = 5;
  console.log(x, y);
}

print();

이λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…μž₯μ—μ„œ μ‚΄νŽ΄λ³΄λ©΄,

  1. κΈ€λ‘œλ²Œ 였브젝트(GO) (x = 10 / y = 20 / print = function)
  • μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜λ©΄ κΈ€λ‘œλ²Œ μ˜€λΈŒμ νŠΈκ°€ μƒμ„±λœλ‹€
  • GOμ—λŠ” μ „μ—­ λ³€μˆ˜λ“€κ³Ό ν•¨μˆ˜κ°€ ν”„λ‘œνΌν‹°λ‘œ μ €μž₯λœλ‹€
  1. print μ»¨ν…μŠ€νŠΈ (x = 5)
  2. μ°Έμ‘°ν•œ λ³€μˆ˜ (x = 5 / y = 20)

[ 과제 뢄석 ]

Q. 1초 κ°„κ²©μœΌλ‘œ 0~3κΉŒμ§€μ˜ μˆ«μžκ°€ μˆœμ„œλŒ€λ‘œ 좜λ ₯λ˜λ„λ‘ λ§Œλ“€μ–΄λΌ.

// μ˜€λ‹΅ 뢄석 (μ •λ‹΅ μ•„λ‹˜)
for (var i = 0; i < 4; i++) {
  setTimeout(() => {
    console.log(i);
  }, 1000);
}

이λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…μž₯μ—μ„œ μ‚΄νŽ΄λ³΄λ©΄,

  • var을 μ΄μš©ν•΄ μ„ μ–Έλœ λ³€μˆ˜ iλŠ” μ „μ—­ λ³€μˆ˜λ‘œ hoisting(ν˜Έμ΄μŠ€νŒ…)λœλ‹€. for 반볡문이 μ‹œμž‘λ˜λ©΄ λ³€μˆ˜ iμ—λŠ” 0이 ν• λ‹Ήλœλ‹€.
  • iκ°€ 4보닀 μž‘λ‹€λŠ” 쑰건을 λ§Œμ‘±ν•˜λ―€λ‘œ κ³§λ°”λ‘œ 반볡문의 본문을 μ‹€ν–‰ν•˜κ³ μž ν•œλ‹€.
  • κ·ΈλŸ¬λ‚˜ μœ„μ˜ setTimeout ν•¨μˆ˜λŠ” 1초(1000ms = 1s)κ°€ 지날 λ•ŒκΉŒμ§€ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šκ³  λŒ€κΈ°ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
  • 반면, for λ°˜λ³΅λ¬Έμ€ 속도가 맀우 λΉ λ₯΄κΈ° λ•Œλ¬Έμ— 처음 본문으둜 κ°”λ‹€κ°€ i++λ₯Ό 거쳐 λ°”λ‘œ λ‹€μŒ i에 1μ΄λž€ 값을 ν• λ‹Ήν•˜κ²Œ 되고, 또 λ‹€μ‹œ 본문으둜 κ°”λ‹€κ°€ λ‹€μŒ i둜 λ„˜μ–΄κ°€κΈΈ λ°˜λ³΅ν•˜κ²Œ λœλ‹€.
  • κ²°κ΅­ 1μ΄ˆλ³΄λ‹€ 훨씬 짧은 μ‹œκ°„μ— 0 ~ 3κΉŒμ§€ 4번의 λ°˜λ³΅μ„ 거치게 λœλ‹€

for 반볡문이 끝났을 λ•Œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

  1. GO (i = 4)
  2. for μ»¨ν…μŠ€νŠΈ (empty)
  3. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  4. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  5. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  6. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  • 1μ΄ˆκ°€ μ§€λ‚œ ν›„ 3, 4, 5, 6의 setTimeout ν•¨μˆ˜λŠ” iλž€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•˜λŠ”λ° 자체 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” iλž€ λ³€μˆ˜μ˜ 값을 찾을 수 μ—†λ‹€
  • κ·Έλ¦¬ν•˜μ—¬ κ³„μ†ν•΄μ„œ μƒμœ„ μ»¨ν…μŠ€νŠΈλ₯Ό 찾게 되고, GOμ—μ„œ λΉ„λ‘œμ†Œ λ³€μˆ˜ i의 값을 λ°œκ²¬ν•˜κ²Œ λœλ‹€
  • κ²°κ΅­ 4λ₯Ό 거의 λ™μ‹œμ— 4번 좜λ ₯ν•˜κ²Œ λœλ‹€

πŸ”Ž μ΄λŸ¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•œ 이유

  • setTimeout ν•¨μˆ˜ μ†μ˜ λ³€μˆ˜ iκ°€ μ™ΈλΆ€ λ³€μˆ˜μ˜ 값이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€.
  • 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” setTimeout을 λ‚΄λΆ€ ν•¨μˆ˜λ‘œ ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³ , κ·Έ μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μ˜ 값을 λ‚΄λΆ€ ν•¨μˆ˜μΈ setTimeout의 λ³€μˆ˜ iκ°€ μ°Έμ‘°ν•˜λ„λ‘ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

πŸ’‘ 문제 ν•΄κ²° 포인트

  • setTimeout ν•¨μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” iλΌλŠ” λ³€μˆ˜κ°€ 1초 후에도 변함없이 μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€. 즉, i = 4 (X) / i = 0 ~ 3 (O)
  • κ·ΈλŸ¬λ‚˜ for μ»¨ν…μŠ€νŠΈλŠ” iλ₯Ό 맀우 λΉ λ₯΄κ²Œ λ³€κ²½ν•˜κΈ° λ•Œλ¬Έμ— setTimeout이 μ‹€ν–‰λ˜λŠ” 1초 λ’€κΉŒμ§€ iλ₯Ό μœ μ§€ν•  μˆ˜κ°€ μ—†λ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

(2) μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE)

  • ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것과 λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜

  • 읡λͺ… ν•¨μˆ˜λ₯Ό ( )둜 감싸쀀 ν›„ λ§€κ°œλ³€μˆ˜λ₯Ό 적어주면 λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€

(function (x) {
  console.log(x);
})(5)

이λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…μž₯μ—μ„œ μ‚΄νŽ΄λ³΄λ©΄,

  1. GO (empty)
  2. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈ (x = 5)
  • console.logλŠ” xλΌλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ”λ° μ΄λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ—μ„œ 찾을 수 있기 λ•Œλ¬Έμ— λ°”λ‘œ 5λ₯Ό 좜λ ₯ν•˜κ²Œ λœλ‹€.

  • μ •λ¦¬ν•˜λ©΄, μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” μƒˆλ‘œμš΄ μ»¨ν…μŠ€νŠΈλ₯Ό λ§Œλ“€μ–΄μ£Όκ³ , 인자둜 받은 κ°’(이 경우 '5')을 μ»¨ν…μŠ€νŠΈμ— 'μ €μž₯'ν•  수 μžˆλ‹€.

  • 이λ₯Ό μœ„μ˜ 문제 ν•΄κ²° ν¬μΈνŠΈμ— μ‘μš©ν•  수 μžˆλ‹€.

    즉, setTimeout이 μ‹€ν–‰λ˜λŠ” 1초 λ’€κΉŒμ§€ iλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄
    μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³  κ·Έ λ‚΄λΆ€ ν•¨μˆ˜λ‘œ setTimeout ν•¨μˆ˜λ₯Ό 적어쀀 ν›„
    μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ μžλ¦¬μ— iλ₯Ό 적어주면
    for λ°˜λ³΅λ¬Έμ„ 거쳐 λ‚˜μ˜¨ i의 값을 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈμ— μ €μž₯ν•  수 μžˆλ‹€.

μ΅œμ’… λ‹΅μ•ˆ

for(var i = 0; i < 4; i++) {
  (function (x) {
    setTimeout(function () {
      console.log(x);
    }, 1000*x);
  })(i)
}

πŸ’‘ ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ‚¬μš©

[아티클 ν”„λ‘œμ νŠΈ 058] μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ°Έκ³ 

(function (x) {
  console.log(x);
})(5)

μ›λž˜ 정석

((x) => {
  console.log(x);
})(5)

ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ³€ν™˜
function ν‚€μ›Œλ“œ μ‚­μ œ, ν™”μ‚΄ν‘œ μΆ”κ°€

(x => console.log(x))(5)

ν™”μ‚΄ν‘œ 쒌츑, λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΌ λ•Œ ( ) μƒλž΅ κ°€λŠ₯
ν™”μ‚΄ν‘œ 우츑, ν•œ μ€„μ˜ κ°„κ²°ν•œ ν•¨μˆ˜λΌλ©΄ { } μƒλž΅ κ°€λŠ₯ / ;도 같이 μƒλž΅ν•΄μ•Ό 함

-(x => console.log(x))(5)
+(x => console.log(x))(5)
;(x => console.log(x))(5)

맨 μ•žμ— - / + / ; ν‘œμ‹œ κ°€λŠ₯

πŸ“Œ μ΅œμ΅œμ’… λ‹΅μ•ˆ

for (var i = 0; i < 4; i++) {
  (x => {
    setTimeout (() => {
      console.log(x);
    }, 1000*x);
  })(i)
}

for 반볡문이 끝났을 λ•Œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

  1. GO (i = 4)
  2. for μ»¨ν…μŠ€νŠΈ (empty)
  3. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈ (i = 0)
  4. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  5. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈ (i = 1)
  6. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  7. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈ (i = 2)
  8. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  9. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈ (i = 3)
  10. setTimeout μ»¨ν…μŠ€νŠΈ (empty)
  • 1μ΄ˆκ°€ μ§€λ‚œ ν›„ 4, 6, 8, 10의 setTimeout ν•¨μˆ˜λŠ” xλž€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•˜λŠ”λ° 자체 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” xλΌλŠ” λ³€μˆ˜μ˜ 값을 찾을 수 μ—†λ‹€
  • κ·Έλ¦¬ν•˜μ—¬ μƒμœ„ μ»¨ν…μŠ€νŠΈλ₯Ό 찾게 λ˜λŠ”λ° 이 경우 setTimeout ν•¨μˆ˜λ₯Ό 감싸고 μžˆλŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ—μ„œ xλž€ λ³€μˆ˜λ₯Ό 찾을 수 μžˆλ‹€
  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ xμ—λŠ” for λ°˜λ³΅λ¬Έμ„ 거쳐 λ‚˜μ˜¨ i의 값이 μ €μž₯λ˜μ–΄ μžˆλ‹€
  • κ²°κ΅­ 0, 1, 2, 3을 1μ΄ˆμ— ν•œ λ²ˆμ”© 좜λ ₯ν•˜κ²Œ λœλ‹€ (∡ 1000*x)

cf. 같은 문제λ₯Ό 가지고 μžˆλŠ” 또 λ‹€λ₯Έ 예제

var arr = [];

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

for (var index in arr) {
  console.log(arr[index]()); // 문제 λ°œμƒ : 5만 5번 좜λ ₯됨
}
  1. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ (& ν™”μ‚΄ν‘œ ν•¨μˆ˜) μ΄μš©ν•΄μ„œ μ½”λ“œ μˆ˜μ •
var arr = [];

for (var i = 0; i < 5; i++) {
  (x => {
    arr[x] = () => x;
  })(i);
}

for (var index in arr) {
  console.log(arr[index]()); // 문제 ν•΄κ²° : 0 1 2 3 4 좜λ ₯됨
}
  1. ν•œνŽΈ, κΈ°μ‘΄ μ½”λ“œμ˜ var을 let으둜 바꿔도 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€. let은 블둝 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” μ§€μ—­λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©λ˜λŠ” ν‚€μ›Œλ“œμ΄λ‹€.
var arr = [];

for (let i = 0; i < 5; i++) { // κΈ°μ‘΄ μ½”λ“œμ—μ„œ var을 let으둜만 λ°”κΏ¨λ‹€
  arr[i] = function () {
    return i;
  }
}

for (var index in arr) {
  console.log(arr[index]()); // 문제 ν•΄κ²° : 0 1 2 3 4 좜λ ₯
}

2. hoisting(ν˜Έμ΄μŠ€νŒ…)

1) 의미

  • hoistingμ΄λž€ μœ„λ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” 것을 μ˜λ―Έν•œλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ hoistingμ΄λž€ λͺ¨λ“  λ³€μˆ˜ 선언문이 ν•΄λ‹Ή μ½”λ“œκ°€ μ†ν•œ μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§„ μƒνƒœλ‘œ μ‹€ν–‰λ˜λŠ” 것을 λ§ν•œλ‹€.

  • μ£Όμ˜ν•  점은 λ³€μˆ˜ μ„ μ–Έλ¬Έ'만' λŒμ–΄μ˜¬λ €μ§„λ‹€λŠ” 것이닀. λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜λŠ” ꡬ문은 λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠλŠ”λ‹€.

var a = 1;

function foo () {
 console.log(a);
 var a = 2;
}

foo();

이 κ²½μš°μ— μ‹€μ œλ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 흐름은 μ•„λž˜μ™€ κ°™λ‹€

var a = 1;

function foo () {
 var a; // λ³€μˆ˜ 선언문이 그것이 μ†ν•œ μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§
 console.log(a);
 a = 2; // λ³€μˆ˜μ— 값이 ν• λ‹Ήλœ ꡬ문은 λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠμŒ
}

foo();

foo ν•¨μˆ˜ λ‚΄μ—μ„œ aλ₯Ό 좜λ ₯ν•΄λ‹¬λΌλŠ” API 이전에 aλΌλŠ” λ³€μˆ˜λŠ” μ„ μ–Έλ§Œ λ˜μ–΄ μžˆμ„ 뿐, λ³€μˆ˜μ— 값은 ν• λ‹Ήλ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— console μ°½μ—λŠ” undefinedλΌλŠ” 값이 좜λ ₯λœλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 경우,

d();

var d = function () {
  console.log('λ©”λ‘±');
}

이 κ²½μš°μ— μ‹€μ œλ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 흐름은 μ•„λž˜μ™€ κ°™λ‹€

var d; // λ³€μˆ˜ 선언문이 그것이 μ†ν•œ μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§
d();

d = function () { // λ³€μˆ˜μ— 값이 ν• λ‹Ήλœ ꡬ문은 λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠμŒ
  console.log('λ©”λ‘±');
}

λ³€μˆ˜ 선언문이 μ†ν•œ μŠ€μ½”ν”„κ°€ μ „μ—­ μŠ€μ½”ν”„μ΄λ―€λ‘œ λ³€μˆ˜ 선언문은 λͺ¨λ“  μ½”λ“œμ˜ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§„λ‹€. κ·ΈλŸ¬λ‚˜ μ•„μ§κΉŒμ§€ dλΌλŠ” λ³€μˆ˜λŠ” μ„ μ–Έλ§Œ λ˜μ–΄ μžˆμ„ 뿐, λ³€μˆ˜μ— ν•¨μˆ˜κ°€ ν• λ‹Ήλ˜μ–΄ μžˆμ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— d();λΌλŠ” ν•¨μˆ˜ 싀행문을 λ§Œλ‚˜λ©΄ console μ°½μ—λŠ” d is not a functionμ΄λΌλŠ” errorκ°€ 뜨게 λœλ‹€.

ν•œνŽΈ,

k();

function k () {
  console.log('k');
}

ν•¨μˆ˜ μ„ μ–Έμ‹μœΌλ‘œ μž‘μ„±λœ ν•¨μˆ˜λŠ” 항상 ν†΅μ§Έλ‘œ μ΅œμƒμœ„λ‘œ λŒμ–΄μ˜¬λ €μ§€κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 싀행문이 어디에 μœ„μΉ˜ν•˜λ“  μ‹€ν–‰μ—λŠ” 지μž₯을 주지 μ•ŠλŠ”λ‹€.


데이터 νƒ€μž…


μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값듀은 λ™μž‘ 원리에 따라 크게 primitive와 reference둜 λ‚˜λˆŒ 수 μžˆλ‹€. ([TIL] 210901 δΈ­ '데이터 νƒ€μž…' λΆ€λΆ„ 같이 λ³Ό 것)

1. Primitive (μ›μ‹œ νƒ€μž…)

  • μ›μ‹œμ μœΌλ‘œ μž‘λ™
  • κ°’ 자체λ₯Ό λ³€μˆ˜μ— λ‹΄μ•„ λ†“λŠ”λ‹€
  • boolean, number, string, null, undefined, symbol

βœ” 예제 뢄석

let a = 10; // aλΌλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , 10μ΄λΌλŠ” 값을 ν• λ‹Ή
const b = a; // bλΌλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , a λ³€μˆ˜μ˜ 값인 10을 ν• λ‹Ή

a = 30; // a λ³€μˆ˜μ— 30μ΄λΌλŠ” 값을 ν• λ‹Ή

console.log(b); // b λ³€μˆ˜μ˜ 값은 κ·ΈλŒ€λ‘œ 10

두 번째 쀄 μ½”λ“œμ—μ„œ λ³€μˆ˜ a와 b의 값은 10으둜 κ°™λ‹€


2. reference (μ°Έμ‘° νƒ€μž…)

  • μ°Έμ‘° λ°©μ‹μœΌλ‘œ μž‘λ™
  • λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜ 값을 λ³€μˆ˜μ— λ‹΄μ•„ λ†“λŠ”λ‹€
  • Object (객체, ν•¨μˆ˜, λ°°μ—΄)

βœ” 예제 뢄석 1

const list1 = [1, 2, 3];
const list2 = [1, 2, 3];

const result = list1 === lest2;

console.log(result); // false

λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , κ·Έ κ°’μœΌλ‘œ 배열을 ν• λ‹Ήν•΄μ€€λ‹€. μ΄λ•Œ λ©”λͺ¨λ¦¬μ—λŠ” λ°°μ—΄ 정보가 μ €μž₯되고, λ³€μˆ˜μ—λŠ” κ·Έ λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜ 값이 λ‹΄κΈ°κ²Œ λœλ‹€.

즉, 처음 μƒˆλ‘œ λ§Œλ“  배열을 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜κ³  κ·Έ μœ„μΉ˜κ°’μ„ list1이라고 ν•œ ν›„ λ‹€μ‹œ 또 μƒˆλ‘œ λ§Œλ“  배열을 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜κ³  κ·Έ μœ„μΉ˜κ°’μ„ list2라고 ν•΄μ€€ 것이닀. λ”°λΌμ„œ list1μ΄λΌλŠ” μœ„μΉ˜κ°’κ³Ό list2λΌλŠ” λ‹€λ₯΄λ‹€.

예제 뢄석 2

const list1 = [1, 2, 3];
const list2 = list1; // μƒˆλ‘œμš΄ 배열을 λ§Œλ“  것이 μ•„λ‹ˆλΌ list1 λ³€μˆ˜μ˜ μœ„μΉ˜ 값을 list2 λ³€μˆ˜μ— ν• λ‹Ήν•΄μ€€ 것

const result = list1 === list2;

console.log(result); // true

예제 뢄석 3

var updateAge = function () {
  this.age++;
};

var son = {
  age : 3,
  growUp : updateAge
};

var daughter = {
  age : 7,
  growUp : updateAge
}

var mother = {
  age : 38,
  growUp : updateAge,
  children : [son, daughter]
};

var father = {
  age : 38,
  growUp : updateAge,
  wife : mother,
  children : [son, daughter]
};

// 1번
if (father.growUp === son.growUp) {
  console.log('였예');
}

// 2번
if (father.children === mother.children) {
  console.log('μ™€μš°');
}
  • 1번 μ„€λͺ…

    father 객체의 growUp 속성은 λ³€μˆ˜ updateAgeλΌλŠ” 값을 가진닀. λ³€μˆ˜ updateAgeμ—λŠ” ν•¨μˆ˜κ°€ ν• λ‹Ήλ˜μ–΄ μžˆλ‹€. ν•¨μˆ˜λŠ” μ°Έμ‘° λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ―€λ‘œ λ³€μˆ˜ updateAgeμ—λŠ” λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜ 값이 λ‹΄κΈ°κ²Œ λœλ‹€. mother 객체의 growUp μ†μ„±μ˜ 값도 λ³€μˆ˜ updateAgeμ΄λ―€λ‘œ 같은 μœ„μΉ˜ 값이 λ‹΄κΈ°κ²Œ λœλ‹€. λ”°λΌμ„œ if 쑰건을 λ§Œμ‘±ν•˜λ―€λ‘œ console μ°½μ—λŠ” μ˜€μ˜ˆκ°€ 좜λ ₯λœλ‹€.

  • 2번 μ„€λͺ…

    father 객체의 children 속성은 배열을 κ°’μœΌλ‘œ 가진닀. 배열은 μ°Έμ‘° λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ―€λ‘œ father.childrenμ—λŠ” κ·Έ 배열이 μ €μž₯된 λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜ 값이 ν• λ‹Ήλœλ‹€. mother 객체의 children 속성 λ˜ν•œ μƒˆλ‘œμš΄ 배열을 κ°’μœΌλ‘œ κ°€μ§€λ―€λ‘œ mother.children에도 μƒˆλ‘œμš΄ 배열이 μ €μž₯된 λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜ 값이 ν• λ‹Ήλœλ‹€. 즉, μƒˆλ‘œμš΄ 배열을 2번 λ§Œλ“€μ—ˆμœΌλ―€λ‘œ κ·Έ μœ„μΉ˜ κ°’ λ˜ν•œ μ„œλ‘œ λ‹€λ₯΄κ²Œ λœλ‹€. λ”°λΌμ„œ if 쑰건을 λΆˆλ§Œμ‘±ν•˜λ―€λ‘œ console μ°½μ—λŠ” μ•„λ¬΄λŸ° 값도 λœ¨μ§€ μ•ŠλŠ”λ‹€.


✨ 내일 ν•  것

  1. Reference μΆ”κ°€ 곡뢀

  2. JavaScript Koans

profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€