πŸ“–11. let, const, var, function 싀행원리

Lee JinoΒ·2022λ…„ 9μ›” 23일
0

πŸ“– let, const, var, function 싀행원리

πŸš€ 1. let, const, var

  • let λ³€μˆ˜μ™€ constλŠ” ES6 이후 μŠ€νŽ™μ—μ„œ μƒˆλ‘­κ²Œ λ“±μž₯ν•œ λ³€μˆ˜μ΄λ‹€. κ·Έλž˜μ„œ λΈŒλΌμš°μ € 배포용 μ½”λ“œκ°™μ€ κ²½μš°λŠ” 아직도 varλ³€μˆ˜λ§Œ μ‚¬μš©λ˜λŠ” κ²½μš°λ„ μžˆλ‹€κ³  ν•œλ‹€.

▢️ var,let,const λ₯Ό κ΅¬λΆ„ν•˜λŠ” κ°€μž₯ μ€‘μš”ν•œ 점을 μš”μ•½ν•˜λ©΄

  • κ°’ λ³€κ²½ κ°€λŠ₯ 유무
  • μŠ€μ½”ν”„ λ²”μœ„
  • ν˜Έμ΄μŠ€νŒ… κ°€λŠ₯ 유무
  • μš°μ„  μˆœμœ„λŠ” const -> let -> var 이라고 ν•˜λ‹ˆ μ΅œλŒ€ν•œ μš°μ„ μˆœμœ„μ— λ§žμΆ°μ„œ μ¨μ•Όν•©λ‹ˆλ‹€.

πŸš€ 1-1. κ°’ λ³€κ²½ κ°€λŠ₯ 유무

  • var와 let을 값이 μ„ μ–Έλœ 이후에도 값을 λ³€κ²½ν•  수 μžˆμœΌλ‚˜,
    constλŠ” 생성할 λ•Œ μ„ μ–Έλœ μ΄ˆκΈ°κ°’μ„ λ³€κ²½ν•  수 μ—†λ‹€.

πŸš€ 1-2. ν•¨μˆ˜μŠ€μ½”ν”„ vs λΈ”λ‘μŠ€μ½”ν”„

  • var은 ν•¨μˆ˜μŠ€μ½”ν”„

  • letκ³Ό const λ³€μˆ˜λŠ” 블둝 μŠ€μ½”ν”„


πŸš€ 1-3. ν˜Έμ΄μŠ€νŒ… κ°€λŠ₯ 유무

  • var은 ν˜Έμ΄μŠ€νŒ… κ°€λŠ₯,

    letκ³Ό constλŠ” ν˜Έμ΄μŠ€νŒ… λΆˆκ°€λŠ₯

  • μ΄λ ‡κ²Œ if문을 감싸고 μžˆλŠ” {블락} 이 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ˜μ—­μ΄ λ˜μ–΄ λ³€μˆ˜κ°€ κ΅¬λΆ„λ˜μ–΄ 진닀.

  • μœ„μ™€ 같이 let을 μ“°λ©΄ ifμ•ˆκ³Ό λ°–μœΌλ‘œ μŠ€μ½”ν”„κ°€ λ‹¬λΌμ§€μ§€λ§Œ (블둝 μ•ˆκ³Ό λ°–μ˜ μŠ€μ½”ν”„κ°€ λ‹¬λΌμ Έμ„œ λ³€μˆ˜ 이름이 같아도 값이 λŒ€μ²΄λ˜μ§€ μ•Šμ•„ 같은 μŠ€μ½”ν”„μ—λŠ” 같은 이름 μ‚¬μš© λΆˆκ°€ν•˜λ‹€),

  • name을 varλ³€μˆ˜λ‘œ μ„ μ–Έ ν–ˆμ„ κ²½μš°μ—λŠ” if μ•ˆκ³Ό 밖이 같은 μŠ€μ½”ν”„κ°€ λ˜μ–΄μ„œ "Uncaught SyntaxError: Identifier 'name' has already been declared"였λ₯˜κ°€ 뜨게됨

πŸš€ 2. function()의 원리

▢️ 엔진이 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” 방법

ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이름(μ‹λ³„μž)이 ν•„μš”ν•©λ‹ˆλ‹€. 이름이 μžˆμ–΄μ•Ό μŠ€μ½”ν”„μ—μ„œ 값을 μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • 예λ₯Ό λ“€μ–΄ function foo(){}λ₯Ό μ •μ˜ν•˜λ©΄ foo(); ꡬ문을 μ΄μš©ν•΄ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

==> <ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” 흐름>

  • 엔진이 ν•¨μˆ˜ 선언문을 λ§Œλ‚˜λ©΄ μ‹λ³„μžλ₯Ό κ΄€λ¦¬ν•˜λŠ” νŠΉλ³„ν•œ 집합(EnviromentRecord)에 ν•¨μˆ˜μ˜ 이름을 μ‹λ³„μžλ‘œ λ„£κ³  ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μ°Έμ‘°ν•©λ‹ˆλ‹€. 그리고 ν•¨μˆ˜ μ‹€ν–‰ ꡬ문 쀑 fooλ₯Ό λ§Œλ‚˜λ©΄ 값을 μŠ€μ½”ν”„λ₯Ό 톡해 κ°€μ Έμ˜΅λ‹ˆλ‹€. κ·Έ λ‹€μŒ ꡬ문이 () μ΄λ―€λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•˜λ‹€λ©΄ μ‹€ν–‰ν•©λ‹ˆλ‹€.

  • λ§Œμ•½ μŠ€μ½”ν”„μ—μ„œ μ‹λ³„μžλ₯Ό 찾지 λͺ»ν–ˆλ‹€λ©΄ μ°Έμ‘° μ—λŸ¬(ReferenceError)λ₯Ό 좜λ ₯ν•˜κ³ , μ‹λ³„μžλŠ” μ°Ύμ•˜μ§€λ§Œ μ‹€ν–‰ν•  수 μ—†λŠ” νƒ€μž…μ΄λΌλ©΄ νƒ€μž… μ—λŸ¬(TypeError)λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

▢️ 읡λͺ…ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법

  • function(){} ꡬ문은 이름 μ—†λŠ” β€œμ΅λͺ…ν•¨μˆ˜β€ μ΄λ―€λ‘œ 엔진이 μŠ€μ½”ν”„λ₯Ό 톡해 값을 κ°€μ Έμ˜¬ 수 μžˆλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 이 문법을 μ‹€ν–‰ν•˜λ©΄ ν•¨μˆ˜μ˜ 이름이 ν•„μš”ν•˜λ‹€κ³  문법 였λ₯˜λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.(이 였λ₯˜ λ©”μ‹œμ§€λŠ” λΈŒλΌμš°μ € λ§ˆλ‹€ λ‹€λ¦…λ‹ˆλ‹€.)

  • 이름 μ—†λŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” μœ λ¦΄ν•œ κ²½μš°λŠ” ν•¨μˆ˜λ₯Ό κ°’μœΌλ‘œ μ‚¬μš©(전달, λŒ€μž…, λ°˜ν™˜, μ—°μ‚°)ν•  λ•Œ μž…λ‹ˆλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ‹¨ν•­μ—°μ‚°μž(-, +, ~, !)λ₯Ό λ§Œλ‚˜κ²Œ 되면 function(){}을 κ°’μœΌλ‘œ ν‰κ°€ν•©λ‹ˆλ‹€. μ‰½κ²Œ 말해 연산을 μœ„ν•΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜κ²Œ 되고 μ΅œμ’…μ μœΌλ‘œ () ꡬ문을 μ΄μš©ν•΄ μ‹€ν–‰ν•  수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

  • κ²°κ΅­ +function(){}()은 읡λͺ… ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ μ—”μ§„μ˜ 원리λ₯Ό μ΄μš©ν•΄ λ§Œλ“  νŽΈλ²•μž…λ‹ˆλ‹€.

  • 이 원리λ₯Ό μ΄μš©ν•œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ 쀑 κ°€μž₯ λŒ€μ€‘μ μΈ 방식은 (function(){})()μž…λ‹ˆλ‹€. ()λŠ” ꡬ문 평가λ₯Ό ν•˜λŠ”λ° ν‰κ°€λœ κ²°κ³Όκ°€ ν•¨μˆ˜μ΄λ‹ˆ ν•¨μˆ˜ 객체λ₯Ό λ§Œλ“€κ³  μ΄μ–΄μ„œ () ꡬ문으둜 μ¦‰μ‹œ μ‹€ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

  • 남이 μ½μ„λ•Œ ν˜Όλž€μŠ€λŸ½μ§€ μ•Šμ•„μ•Ό 쒋은 μ½”λ“œλΌκ³  ν•  수 있겠죠. λ”°λΌμ„œ λΉ„λŒ€μ€‘μ μΈ +function(){}() 보닀 (function(){})() μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μ½λŠ” κ°œλ°œμžκ°€ μ¦‰μ‹œ μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜ μž„μ„ μ‰½κ²Œ μ•Œ 수 μžˆλ„λ‘ ν•˜λŠ”νŽΈμ΄ μ’‹κ² μŠ΅λ‹ˆλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ꡬ문이 μœ μ—°ν•˜κΈ° λ•Œλ¬Έμ— μžμ‹ λ§Œμ˜ κ·œμΉ™μ΄λ‚˜ 법칙을 λ§Œλ“€κΈ° μ‰½μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” ν˜‘μ—…μ‹œ 독이 될 수 μžˆμŒμ„ λͺ…μ‹¬ν•΄μ•Όν•©λ‹ˆλ‹€.

profile
μ•ˆλ…•ν•˜μ„Έμš”

0개의 λŒ“κΈ€