[๊ฐœ์ธ ๊ณผ์ œ] more about JavaScript

Chaewon Yoon (Jamie)ยท2022๋…„ 8์›” 10์ผ
0

[Today I learned]

๋ชฉ๋ก ๋ณด๊ธฐ
3/32

JavaScript์— ๋Œ€ํ•ด ๋” ๊ณต๋ถ€ํ•˜๊ธฐ

๐Ÿค JavaScript์˜ ์ž๋ฃŒํ˜•๊ณผ JavaScript๋งŒ์˜ ํŠน์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ ?

  • ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด (Javascript์˜ ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ํŠน์ • ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น ๋ฐ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค)

  • JavaScript ํ˜•๋ณ€ํ™˜
    Javascript๋Š” ํƒ€์ž…์ด ๋งค์šฐ ์œ ์—ฐํ•œ ์–ธ์–ด.

    • ์ˆซ์žํ˜• Number()
    • ์ •์ˆ˜ํ˜• ์ˆซ์ž parseInt()
    • ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ์ˆซ์ž parseFloat()
    • ๋ฌธ์žํ˜• String()
    • ์ฃผ์–ด์ง„ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ํ›„ ๋ฐ˜ํ™˜ toString()
    • ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์†Œ์ˆ˜์  ํ‘œํ˜„ toFixed()
    • ๋ถˆ๋ฆฌ์–ธ Boolean()
  • ==, ===

    • = : ๋Œ€์ž… ์—ฐ์‚ฐ์ž
    var a = 1;
    let b = 3;
    const c = '5';
    • == : ๋™๋“ฑ ์—ฐ์‚ฐ์ž(coercive). ๊ฐ•์ œ ํ˜• ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    var a = 3;
    var b = '3'; //๋ฌธ์ž์—ด
    let c = 3;
    a == b //true
    a == c //true
    b == c //true
    • === : ์ผ์น˜ ์—ฐ์‚ฐ์ž(strict equality). ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜ ๊ณผ์ • ์—†๋Š” ์—„๊ฒฉํ•œ ๋น„๊ต
    var a = 3;
    var b = '3'; //๋ฌธ์ž์—ด
    let c = 3;
    a == b //false
    a == c //true
    b == c //false

    ๊ทธ๋Ÿผ '=='๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€?
    => ์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’ ์ฒดํฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํŒ๋ณ„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํ•œ ๋น„๊ต๊ฐ€ ๋ณด์žฅ๋˜๋Š” '==='๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ด๊ณ  ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.
    ๋Š์Šจํ•œ ํƒ€์ž…์€ ํƒ€์ž… ์—†์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    /* JavaScript Example (loose typing) */
    var a = 13; // Number ์„ ์–ธ
    var b = "thirteen"; // String ์„ ์–ธ
    
    /* Java Example (strong typing) */
    int a = 13; // int ์„ ์–ธ
    String b = "thirteen"; // String ์„ ์–ธ

    java๋Š” ์ˆซ์ž๋ฉด int๋กœ ์„ ์–ธํ•˜๊ณ  ๋ฌธ์ž๋ฉด string์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š”๋ฐ javascript๋Š” ๋Š์Šจํ•ด์„œ ํŽธํ•˜๊ตฌ๋‚˜~๐Ÿ”

    ๋ฌธ์ œ์ ์€ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋‚˜ ํ˜‘์—… ์‹œ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊นŒ๋‹ค๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
    ๋ณด์™„ -> Javascript์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜์—ฌ ์ •์  ํƒ€์ž… ์ฒดํฌ์™€ ๊ฐ•๋ ฅํ•œ ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•œ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•จ.
    ๐Ÿ‘ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์›Œ์•ผ๊ฒ ๋„ค? ใ…Žใ…Ž...

  • undefined์™€ null์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋“ค์„ ๋น„๊ตํ•ด๋ณด์„ธ์š”

    • undefined: '์•„๋ฌด ๊ฐ’๋„ ํ• ๋‹น๋ฐ›์ง€ ์•Š์€ ์ƒํƒœ'
      var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์•”๋ฌต์ ์œผ๋กœ undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
      ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ–ˆ์„ ๋•Œ undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๋ฉด ์„ ์–ธ ์ดํ›„ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ๊ฒƒ.
      ๊ทธ๋Ÿผ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฑธ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? => null์„ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค!

    • null: '๋น„์–ด ์žˆ๋Š”, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’' (๊ฐ’์˜ ๋ถ€์žฌ)๋ฅผ ์˜๋ฏธ
      ๋ณ€์ˆ˜์— null์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ด์ „์— ํ• ๋‹น๋˜์–ด ์žˆ๋˜ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ.

๐Ÿค JavaScript ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ์ด๋ž€ ?

  • ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

    • Primative Type(๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ / ์›์‹œ๊ฐ’)
      ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋งํ•œ๋‹ค.

      • Number
      • String
      • Boolean
      • Symbol(ES6์— ์ถ”๊ฐ€, ๊ฐ์ฒด ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…)
      • null
      • undefined

      ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•œ๋‹ค.
      ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ์ €์žฅ๋˜๋ฉฐ ์›์‹œ ๋ฐ์ดํ„ฐ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋ฏ€๋กœ, ๋ถˆ๋ณ€์ ์ด๋‹ค.
      ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.(์žฌ์‚ฌ์šฉ)

    • Reference Type
      ์ฐธ์กฐ ํƒ€์ž…์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ• ๋•Œ ๊ฐ’์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.

      • Object
      • Array
      • Function RegExp (๋ฌธ์ž์—ด์— ๋‚˜ํƒ€๋‚˜๋Š” ํŠน์ • ๋ฌธ์ž์กฐํ•ฉ๊ฐ€ ๋Œ€์‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํŒจํ„ด)
      • Map ๋“ฑ
        ์ฐธ์กฐํ˜•์€ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’์ด ์ง€์ •๋œ ์ฃผ์†Œ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.
  • JavaScript ํ˜•๋ณ€ํ™˜
    ?

  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

    • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ž€?
      '๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด'
      ์ฆ‰, ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป.
    1. const
      const๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Œ. (์žฌํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ)

    2. Object.freeze()
      Javascript์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ. "๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ"

      let test = {
          name : 'kim'
      }
      Object.freeze(test);
      test.name = 'Jung';
      console.log(test) // {name: 'kim'} 'Jung'์œผ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š์Œ.    
      but, Object.freeze()๋Š” ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅ!
      test = {
          age : 15
      };
      console.log(test); // {age: 15} <- ์žฌํ• ๋‹น ๋จ.

      ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” const์™€ Object.freeze()๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.
      (const์˜ ์žฌํ• ๋‹น๋ถˆ๊ฐ€ + Object.freeze()์˜ ๊ฐ์ฒด์†์„ฑ ๋ณ€๊ฒฝ๋ถˆ๊ฐ€)

      const test = {
          'name' : 'jung'
      };

      Object.freeze(test);
      ๋จผ์ € constํ‚ค์›Œ๋“œ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚จ ๋‹ค์Œ, Object.freeze()๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด
      ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น๊ณผ ๊ฐ์ฒด์˜ ์†์„ฑ ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

  • ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ
    ์›์‹œ๊ฐ’์€ ๊ฐ’์„ ๋ณต์‚ฌ ํ•  ๋•Œ ๋ณต์‚ฌ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜์˜ ๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค

    ```js
    const a = 1;
    let b = a;
    
    b = 2
    
    console.log(a); //1
    console.log(b); //2
    ```
    
    ์ฐธ์กฐ๊ฐ’์€ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋œ ๊ฐ’(์ฃผ์†Œ)์ด ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.  
    
    ```js
    const a = {number: 1};
    let b = a;
    
    b.number = 2
    
    console.log(a); // {number: 2}
    console.log(b); // {number: 2}
    ```  
    
    ์ด๋Ÿฐํ•œ ๊ฐ์ฒด์˜ ํŠน์ง• ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.  
    1. ``์–•์€ ๋ณต์‚ฌ(Shallow Copy)``
    </br>
      ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• 
      ์–•์€ ๋ณต์‚ฌ๋ž€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ์œ„์˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์›๋ž˜๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.  
      ๊ฐ์ฒด์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•œ๊ฐœ์˜ ๊ฐ์ฒด๋ผ๋„ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•œ๋‹ค.
  2. ``๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)``
  </br>
    ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    ๊นŠ์€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ ์›๋ณธ๊ณผ์˜ ์ฐธ์กฐ๊ฐ€ ์™„์ „ํžˆ ๋Š์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.





>๐Ÿค ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?
  • ์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ…, TDZ

    1. Scope
      '๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„' / '๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ทœ์น™'
    • ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„; ์ฝ”๋“œ ๋ธ”๋ก {}๋‚ด์—์„œ๋งŒ ์ฐธ์กฐ(์ ‘๊ทผ) ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„
    • ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„; ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐ(์ ‘๊ทผ) ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„
      ES6๋ถ€ํ„ฐ let์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„
    • ๋™์  ์Šค์ฝ”ํ”„

    ๋Œ€๋ถ€๋ถ„์˜ C๊ธฐ๋ฐ˜ ์–ธ์–ด๋“ค์€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
    ํ•˜์ง€๋งŒ Javascript๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

    Scope์˜ ์ข…๋ฅ˜

    1. ์ „์—ญ ์Šค์ฝ”ํ”„ (Global scope)
      ์ „์—ญ์— ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์–ด๋””์„œ๋“ ์ง€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.

    2. ์ง€์—ญ ์Šค์ฝ”ํ”„ (Local scope / Function-level scope)
      ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์Œ.
      ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Œ.

      var global = 'global'; //์ด๋ ‡๊ฒŒ ์ „์—ญ์— ์„ ์–ธํ•˜๋ฉด
      
      function foo() {
      var local = 'local';    //์ง€์—ญ ์Šค์ฝ”ํ”„
      console.log(global);    //์–ด๋””์„œ๋‚˜ ์ฐธ์กฐ๊ฐ€ ๋˜๊ณ 
      console.log(local);
      }
      foo();
      
      console.log(global);    //global
      console.log(local);     // Uncaught ReferenceError: local is not defined ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

  1. hoisting


    "๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•œ ํ›„, ์„ ์–ธ๋งŒ ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ"
    ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ๋ณ€์ˆ˜์„ ์–ธ/ํ•จ์ˆ˜์„ ์–ธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„ ๊ฒƒ ๊ฐ™์€ ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.
    ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ undefined๋กœ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    ๋ฐ˜๋ฉด let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


    ------------ํ˜ธ์ด์ŠคํŒ…๋„ ๋‚˜์ค‘์— ๋” ๊ณต๋ถ€ํ•˜๊ธฐ-------------
  2. TDZ
    "Temporal Dead Zone"
    ๋ณ€์ˆ˜ ์„ ์–ธ ์ „์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ
์Šคํฌ๋ฆฐ์ƒท 2022-08-09 ์˜คํ›„ 10 56 36
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์ฐจ์ด

    • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ(function declartion) : ํ•จ์ˆ˜๋ช…์ด ์ •์˜๋˜์–ด ์žˆ๊ณ , ๋ณ„๋„์˜ ํ• ๋‹น ๋ช…๋ น์ด ์—†๋Š” ๊ฒƒ
    function sum(a,b) {
        return a + b;
    }
    • ํ•จ์ˆ˜ ํ‘œํ˜„์‹ (function Expression) : ์ •์˜ํ•œ function์„ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ
    const sum = function(a,b) {
        return a + b;
    }
    • ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์ฐจ์ด
      • ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค. ์ •์˜๋œ ๋ฒ”์œ„์˜ ๋งจ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…๋˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ ์ „์— ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ.
      • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด ํ˜ธ์ด์ŠคํŒ… ํ•˜๊ฒŒ ๋œ๋‹ค. ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

    • Execution Context(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)๋ž€?
      ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
      ์ฝ”๋“œ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, this, arguments ๋“ฑ์„ ๋ฌถ์–ด, ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜๋ฅผ ์„ค๋ช…ํ•œ๋‹ค๋Š” ๋œป์˜ Execution Context๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
      ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Execution Context๋ฅผ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ Execution Context ๋‚ด์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Execution Context์˜ ๊ด€๋ฆฌ: CallStack
      js ์—”์ง„์€ ์ƒ์„ฑ๋œ Context๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ชฉ์ ์˜ Call Stack(ํ˜ธ์ถœ์Šคํƒ)์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
      JS๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๋‹จ ํ•˜๋‚˜์˜ Call Stack์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
      js ์—”์ง„์€ ์ „์—ญ ๋ฒ”์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ Global Execution Context๋ฅผ ์ƒ์„ฑํ•ด stack์— pushํ•ฉ๋‹ˆ๋‹ค.
      ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋˜๋Š” ์ข…๋ฃŒ ๋  ๋•Œ๋งˆ๋‹ค Global Execution Context์˜ ์œ„๋กœ Functional Execution Context stack์„ push(์ถ”๊ฐ€), pop(์ œ๊ฑฐ)ํ•ฉ๋‹ˆ๋‹ค.

      - Call Stack์€ ์ตœ๋Œ€ stack ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค.   
      Call Stack์— ์Œ“์ธ Context Stack์ด ์ตœ๋Œ€์น˜๋ฅผ ๋„˜๊ฒŒ ๋  ๊ฒฝ์šฐ โ€˜RangeError: Maximum call stack size exceededโ€™๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.   
      ์ด ์—๋Ÿฌ๋Š” Stack Overflow๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Context-Stack


1. ์ฝ”๋“œ์˜ ์ „์—ญ ๋ฒ”์œ„๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ Global Execution Context๋ฅผ pushํ•ฉ๋‹ˆ๋‹ค.
2. fn1์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
3. fn1์˜ Functional Execution Context๊ฐ€ Call Stack์— push๋ฉ๋‹ˆ๋‹ค.
4. fn2์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
5. fn2์˜ Functional Execution Context๊ฐ€ Call Stack์— push๋ฉ๋‹ˆ๋‹ค.
6. console.log๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
7. console.log์˜ Functional Execution Context๊ฐ€ Call Stack์— push ๋ฉ๋‹ˆ๋‹ค.
8. console.log์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉฐ console.log์˜ Functional Execution Context๊ฐ€ pop๋ฉ๋‹ˆ๋‹ค.
9. fn2์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉฐ fn2์˜ Functional Execution Context๊ฐ€ pop๋ฉ๋‹ˆ๋‹ค.
10. fn1์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉฐ fn1์˜ Functional Execution Context๊ฐ€ pop๋ฉ๋‹ˆ๋‹ค.
11. ์•ฑ ์ข…๋ฃŒ ์‹œ Global Execution Context๊ฐ€ pop๋ฉ๋‹ˆ๋‹ค.



  • ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chain)

    ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์— ์˜ํ•ด ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

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

    ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ outerEnvironmentReference์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.

    ๐Ÿ’ก ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ '๋‹จ๋ฐฉํ–ฅ'์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

image

  • ๋ณ€์ˆ˜ ์€๋‹‰ํ™” (variable shadowing)

    ์—ฌ๋Ÿฌ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๊ฒ€์ƒ‰๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    (function s(){
    let a = 'hi'
    })() //a is not defined

    ์ฆ‰, ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ๋˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰๋Š”๊ฒƒ์ด๋‹ค.

    function hello(name) {
       let _name = name;
       return function () {
         console.log('Hello, ' + _name);
       };
     }
    
     let a = new hello('์˜์„œ');
     let b = new hello('์•„๋ฆ„');
    
     a() //Hello, ์˜์„œ
     b() //Hello, ์•„๋ฆ„
     ```
     ์ด๋ ‡๊ฒŒ a์™€ b๋ผ๋Š” ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿค ์‹ค์Šต ๊ณผ์ œ
  • ์ฝ˜์†”์— ์ฐํž b ๊ฐ’์„ ์˜ˆ์ƒํ•ด๋ณด๊ณ , ์–ด๋””์—์„œ ์„ ์–ธ๋œ โ€œbโ€๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ผ์ธ์—์„œ ํ˜ธ์ถœํ•œ console.log์— ์ฐํ˜”๋Š”์ง€, ์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    ์ฃผ์„์„ ํ’€์–ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.
    ```jsx
    let b = 1;
    
    function hi () {
    
    const a = 1;
    
    let b = 100;
    
    b++;
    
    console.log(a,b);   //1,101
    
    }
    
    //console.log(a);   //a๋Š” ์ง€์—ญ์Šค์ฝ”ํ”„๋กœ function() ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚จ. => ๋ณด์™„: ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ์ž.
    
    console.log(b);     //1  b๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ let b = 1;๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
    
    hi();
    
    console.log(b);     //1  b๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ let b = 1;๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
profile
keep growing as a web developer!๐Ÿงƒ

0๊ฐœ์˜ ๋Œ“๊ธ€