Skip to content

Latest commit

ย 

History

History
144 lines (112 loc) ยท 6.71 KB

global_variables.md

File metadata and controls

144 lines (112 loc) ยท 6.71 KB

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง•์ด์ž, ๋ฌธ์ œ์ธ ์ „์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ 

์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ๋งŽ์€ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ด์œ ์ผ๊นŒ์š”?

๋ณ€์ˆ˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ

๋ณ€์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋œ ์œ„์น˜์— ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ƒ๋ช… ์ฃผ๊ธฐ(Life Cycle)๋ผ๊ณ  ํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์•„๋ž˜ ์˜ˆ์ œ๋Š” let, const๊ฐ€ ์•„๋‹Œ var๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

var x = '์ „์—ญ';

function foo() {
  var y = '์ง€์—ญ';
  console.log(y); // ์ง€์—ญ
  return y;
}

foo();
console.log(y);   // undefined

ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์ง€์—ญ ๋ณ€์ˆ˜(y)๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๊ณ  ํ•จ์ˆ˜ ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์†Œ๋ฉธ(undefined)ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์—ญ ๋ณ€์ˆ˜(x)๋Š” ๋Œ€์ฒด ์–ธ์ œ ์†Œ๋ฉธ, ์•„๋‹ˆ ์ƒ์„ฑ๋ ๊นŒ์š”?

์šฐ๋ฆฌ๋Š” ํ˜ธ์ด์ŠคํŒ…(Hoisting)์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์„ ์–ธ๋ฌธ์˜ ์œ„์น˜ ์ƒ๊ด€ ์—†์ด ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ’€์–ด์„œ ๋งํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ์ฃ . ๋‹จ, ์ด ์„ค๋ช…์€ ์ง€์—ญ ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜์ง€ ์•Š๊ณ , ์ „์—ญ ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜๊ฑฐ๋“ ์š”! ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋˜๊ฒ ์ฃ ?

var x = '์ „์—ญ';   // ์ „์—ญ ๋ณ€์ˆ˜ x ์ƒ์„ฑ

function foo() {
                  // ์ง€์—ญ ๋ณ€์ˆ˜ y ์ƒ์„ฑ
  var y = '์ง€์—ญ'; // ์ง€์—ญ ๋ณ€์ˆ˜ y ๊ฐ’ ํ• ๋‹น
  console.log(y);
  return y;
                  // ์ง€์—ญ ๋ณ€์ˆ˜ y ์†Œ๋ฉธ
}

foo();
console.log(y);   // undefined
                  // ์ „์—ญ ๋ณ€์ˆ˜ x ์œ ํšจ

์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ ?

์–ด๋””์„œ๋“  ์ ‘๊ทผํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๊ณผ์—ฐ ์ข‹๊ธฐ๋งŒ ํ• ๊นŒ์š”?

์ด์ œ๋ถ€ํ„ฐ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ์ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

  1. ์•”๋ฌต์  ๊ฒฐํ•ฉ(Implicit Coupling)

    • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์—ฌ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์–ด๋””์„œ๋“  ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํ• ๋‹นํ•˜๊ฒ ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค.
    • ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ํด์ˆ˜๋ก ๊ฐ€๋…์„ฑ์€ ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.
    • ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•œ ์˜์—ญ์—์„œ ๋ณ€์ˆ˜์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์œ„ํ—˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  2. ๊ธด ์ƒ๋ช… ์ฃผ๊ธฐ(Long Life Cycle)

    • ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    • ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋Š” ์‹œ๊ฐ„์ด ๊ธฐ๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ์ž์›๋„ ์˜ค๋ž˜ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
    • ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
    • var ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์˜๋„์น˜ ์•Š์€ ์žฌํ• ๋‹น์ด ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์Šค์ฝ”ํ”„ ์ฒด์ธ์˜ ์ข…์ (Endpoint to Scope Chain)

  • ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋Š๋ฆฝ๋‹ˆ๋‹ค.
  1. ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค์—ผ(Global Namespace Pollution)
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด๋„ ํ•˜๋‚˜์˜ ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ์œ„ํ—˜ํ•œ๋ฐ, ์–ด๋–ป๊ฒŒ ์ด๋ฅผ ๋ฐฉ์ง€(์–ต์ œ)ํ• ๊นŒ์š”?

์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ํ•˜์œ„, ์ฆ‰ ์ข์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ๋ช…์‹œ์ ์ธ ๊ฒฐํ•ฉ์ด ๊ฐ€๋Šฅํ•ด์ง€๋‹ˆ๊นŒ์š”. ๊ทธ๋Ÿผ ์–ด๋–ค ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”?

  1. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(Immediately Invoked Function Expression)

    • ๋‹จ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ํŠน์„ฑ์„ ํ†ตํ•ด ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      (function(){
      var x = 10;     // IIFE์˜ ์ง€์—ญ ๋ณ€์ˆ˜
      }());
      
      console.log(x); // ReferenceError: x is not defined
  2. ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด(Global Namespace Object)

    • ์ „์—ญ์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—ญํ• ์„ ๋‹ด๋‹นํ•  ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ , ์‚ฌ์šฉํ•  ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์‹๋ณ„์ž๊ฐ€ ์ถฉ๋Œํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์•„์ง€๋‚˜, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋ฏ€๋กœ ์œ ์šฉํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.
      var APP = {}; // ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด
      
      // ์›์‹œ ๊ฐ’ ํ• ๋‹นํ•˜๊ธฐ
      App.school = false;
      
      // ์ฐธ์กฐ ๊ฐ’ ํ• ๋‹นํ•˜๊ธฐ
      App.person = {
        name: 'amy',
        age: 16,
      };
      
      console.log(App.school);      // false
      console.log(App.person.name); // amy
  3. ๋ชจ๋“ˆ ํŒจํ„ด(Module Pattern)

    • ํด๋ž˜์Šค(Class)๋ฅผ ๋ชจ๋ฐฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋ฅผ ๋ชจ์•„ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํด๋กœ์ €๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋” ์ž์„ธํžˆ ์•Œ์•„๋ด์š”!
    • ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•์ธ ์บก์Šํ™”(Encapsulation) ๋ฅผ ํ‰๋‚ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      var App = (function(){
        // ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ private ๋ณ€์ˆ˜
        var year = 2021;
      
        return {
          older() {
            return ++year;
          },
          younger() {
            return --year;
          },
          getYear() {
            return year;
          }
        }
      }());
      
      console.log(App.year);      // undefined
      
      console.log(App.older());   // 2022
      console.log(App.getYear()); // 2022
      console.log(App.older());   // 2023
      console.log(App.getYear()); // 2023
      console.log(App.younger()); // 2022
      console.log(App.getYear()); // 2022
    • ์œ„ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์—๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์‹ถ์€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋ฅผ ๋‹ด์ฃ . ์ฆ‰, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ํผ๋ธ”๋ฆญ ๋ฉค๋ฒ„(Public Member)๋กœ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋ผ์ด๋น— ๋ฉค๋ฒ„(Private Member)๋กœ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  4. ES6 ๋ชจ๋“ˆ

  • ES6์— ์ถ”๊ฐ€๋œ ๋ชจ๋“ˆ์€ ํŒŒ์ผ ์ž์ฒด์˜ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ชจ๋“ˆ ๋‚ด์—์„œ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” window ๊ฐ์ฒด์˜ ํ”„]๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • HTML์— <script type='module' src='app.js'></script> ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๋“œ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ app.js๋Š” ๋ชจ๋“ˆ๋กœ์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ์—, Webpack ๋“ฑ์˜ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.