TIL - var, const, let

Wooney98ยท2022๋…„ 11์›” 15์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
1/6
post-thumbnail

var, const, let์˜ ์ฐจ์ด์ 

1. ์ค‘๋ณต์„ ์–ธ

  • ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅ
    - var
// ์ฒซ๋ฒˆ์งธ ๋ณ€์ˆ˜ ์„ ์–ธ+์ดˆ๊ธฐํ™”
var a = 10;
console.log(a); // 10


// ๋‘๋ฒˆ์งธ ๋ณ€์ˆ˜ ์„ ์–ธ+์ดˆ๊ธฐํ™”
var a = 20;
console.log(a); // 20


// ์„ธ๋ฒˆ์งธ ๋ณ€์ˆ˜ ์„ ์–ธ(์ดˆ๊ธฐํ™”X)
var a;
console.log(a); // 20
  • ์ค‘๋ณต ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ
    - let
    - const
// let ์ค‘๋ณต ์„ ์–ธ
let a = 10;
let a = 20; // SyntaxError: Identifier 'a' has already been declared

// const ์ค‘๋ณต ์„ ์–ธ
const b = 10;
const b = 20; // SyntaxError: Identifier 'b' has already been declared

2. ์žฌํ• ๋‹น

  • ๊ฐ’์˜ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜
    - var
    • let
var a = 10;
a = 20;
console.log(a);  // 20


let b = 111;
b = 222;
console.log(b);  // 222
  • ๊ฐ’์˜ ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜
    - const
const c = 111;
c = 222;  // TypeError: Assignment to constant variable.

3. ์Šค์ฝ”ํ”„(Scope)

์Šค์ฝ”ํ”„๋ž€ ์œ ํšจํ•œ ์ฐธ์กฐ ๋ฒ”์œ„๋ฅผ ๋งํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ํ•œ์ • ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„์™€ let, const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅด๋‹ค.

    1. var : ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(function-level scope)

var๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋งŒ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ํ•œ์ •ํ•˜๋ฉฐ, ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์ „์—ญ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

function hello(){
    var a = 10;
    console.log(a);
}

hello(); // 10

console.log(a);  //ReferenceError: a is not defined

hello ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ a๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ์˜์—ญ์—์„œ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰

if(true) {
    var a = 10;
    console.log(a); // 10
}


console.log(a);  // 10

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch ๋ฌธ ๋“ฑ์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ{ ... } ๋‚ด๋ถ€์—์„œ var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ธ”๋Ÿญ ์™ธ๋ถ€์—์„œ๋„ ์–ด๋””์—์„œ๋‚˜ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, let๊ณผ const๋Š” ๋‹ค๋ฅด๋‹ค.

    1. let, cost : ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(block-level scope)
      let, const๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€๋Š” ๋ฌผ๋ก , if๋ฌธ์ด๋‚˜ for๋ฌธ ๋“ฑ์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ{ ... } ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.
if(true) {
    let a = 10;
    console.log(a); // 10
}

console.log(a);  // ReferenceError: a is not defined

if๋ฌธ์˜ ๋ธ”๋Ÿญ ๋‚ด๋ถ€์—์„œ let์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

function hello() {
    let a = 10;
    console.log(a); // 10
}

console.log(a);  // ReferenceError: a is not defined

์ •๋ฆฌํ•˜์ž๋ฉด,

  • var๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋งŒ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์ธ์ •ํ•˜๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๋‹ค.
  • let, const๋Š” ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊นŒ์ง€๋„ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์ธ์ •ํ•˜๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๋‹ค.
  • ์ฐธ๊ณ ๋กœ ๋ธ”๋ก์€ if๋ฌธ์ด๋‚˜ for๋ฌธ ๋“ฑ์—์„œ ์ค‘๊ด„ํ˜ธ{ } ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ฝ”๋“œ ์˜์—ญ์„ ๋งํ•œ๋‹ค.

4.ํ˜ธ์ด์ŠคํŒ…

์ž๋ฐ”์Šคํด๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „, ์ผ์ข…์˜ '์ฝ”๋“œ ํ‰๊ฐ€ ๊ณผ์ •'์„ ๊ฑฐ์น˜๋Š”๋ฐ,
์ด ๋•Œ '๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ'์„ ๋ฏธ๋ฆฌ ์‹คํ–‰๋‘๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ์•ž์˜ ์ฝ”๋“œ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๊ณ  ํ•œ๋‹ค.

    1. var: ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.
console.log(a);  // undefined

var a = 10;

console.log(a);  // 10

๋’ค์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ a๊ฐ€ ์•ž์—์„œ ์ฐธ์กฐ๋˜์—ˆ์Œ์—๋„ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ์ฝ”๋“œ ์‹คํ–‰ ์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋ฏธ๋ฆฌ 1) ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ, 2) undefined๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ๊ธฐ ๋•Œ๋ฌธ ==> ์ด๊ฒƒ์ด var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…์ด๋‹ค.

    1. let, const : ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒ
console.log(a);  // ReferenceError: Cannot access 'a' before initialization

let a = 10;

๋’ค์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์•ž์—์„œ ์ฐธ์กฐํ•˜๋ ค ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.๋งˆ์น˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.
์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” let, const์˜ ํ˜ธ์ด์ŠคํŒ… ๊ณผ์ •์ด var์™€ ๋‹ค๋ฅด๊ฒŒ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

let/const๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ,
์ฝ”๋“œ ์‹คํ–‰ ์ „์—๋Š” 1) ๋ณ€์ˆ˜ ์„ ์–ธ๋งŒ ํ•ด๋‘๋ฉฐ, 2) ์ดˆ๊ธฐํ™”๋Š” ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋งŒ๋‚ฌ์„ ๋•Œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ํ˜ธ์ด์ŠคํŒ…์€ ๋ฐœ์ƒํ•˜๊ธด ํ•˜์ง€๋งŒ, ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์–ด์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ผ์‹œ์ ์œผ๋กœ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ๊ฐ„์„ TDZ(Temporal Dead Zone)๋ผ๊ณ  ํ•œ๋‹ค.

  • ๋ฐœ์ƒํ•˜๋Š”๊ฑธ ํ™•์ธํ•˜๋Š” ๋ฒ•
let a = 10;
if(true){
	console.log(a);// 10
} 

์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ a์˜ ๊ฐ’ 10์„ if๋ฌธ ๋ธ”๋Ÿญ์—์„œ ์ฐธ์กฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค.

let a = 10;  // ์ „์—ญ๋ณ€์ˆ˜ a์„ ์–ธ

if(true){
    console.log(a);  // ReferenceError: Cannot access 'a' before initialization
    let a = 20;  // ์ง€์—ญ๋ณ€์ˆ˜ a ์„ ์–ธ
} 

if๋ฌธ ๋ธ”๋Ÿญ ๋‚ด๋ถ€์—์„œ ์ง€์—ญ๋ณ€์ˆ˜ a๋ฅผ ๋‹ค์‹œ ์„ ์–ธ, ์ง€์—ญ๋ณ€์ˆ˜ a์•ž์—์„œ console.log()๋กœ ์ฐธ์กฐ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ!

์™œ๋ƒํ•˜๋ฉด ์ง€์—ญ๋ณ€์ˆ˜ a๊ฐ€ ํ˜ธ์ด์ŠคํŒ…๋˜๋ฉด์„œ TDZ ๊ตฌ๊ฐ„์ด ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ.
์ฆ‰, let์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

5.์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ฌ๋ถ€

    1. var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ๊ฐ์ฒด(๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ window)์˜ ํ”„๋กœํผํ‹ฐ๋‹ค.
var a =10;
console.log(window.a); //10
console.log(a); //10

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ(ํฌ๋กฌ ์ฝ˜์†” ๋“ฑ)์—์„œ ์œ„ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ,
var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋Š” ๋ธŒ๋ผ์šฐ์ € ์ „์—ญ๊ฐ์ฒด์ธ window์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋œ๋‹ค.

    1. let/const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.
let a = 10;
console.log(window.a); // undefined
console.log(a); //10

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ(ํฌ๋กฌ ์ฝ˜์†” ๋“ฑ)์—์„œ ์œ„ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ,
let์ด๋‚˜ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋Š” ๋ธŒ๋ผ์šฐ์ € ์ „์—ญ๊ฐ์ฒด์ธ window์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (window.a = undefined)

๊ฒฐ๋ก 

1์ˆœ์œ„: const๋ฅผ ์ตœ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

2์ˆœ์œ„: let์€ ๋ณ€์ˆ˜ ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

3์ˆœ์œ„: var๋Š” ES6 ์ดํ›„ ๋ถ€ํ„ฐ... ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณค ์“ธ ํ•„์š”๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค..

  • ๊ตฌ๊ธ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์žฅ์ด ์žˆ๋‹ค

Use const and let
Declare all local variables with either const or let.
Use const by default, unless a variable needs to be reassigned.
The var keyword must not be used.

1. const์™€ let์„ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ผ.
2. ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, const๋ฅผ ๋””ํดํŠธ๋กœ ์‚ฌ์šฉํ•˜๋ผ.
3. var๋Š” ์ ˆ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.

์ถœ์ฒ˜ : https://google.github.io/styleguide/jsguide.html#features-use-const-and-let

profile
๐Ÿ‘จEducation Computer Engineering ๐ŸŽ“Expected Graduation: February 2023 ๐Ÿ“žContact info thstjddn77@gmail.com

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