๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript

javascript/var๋ฅผ ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ 

์ฐธ๊ณ 

๋ชจ๋˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://velog.io/@wksh229/JavaScript-var-%EC%93%B0%EC%A7%80%EB%A7%88-%EC%A0%9C%EB%B0%9C

https://batcave.tistory.com/39

https://valueengine.tistory.com/15

 

 


 

 

var์˜ ํŠน์ง•

 

var๋Š” variable(๋ณ€์ˆ˜)์˜ ์ค€๋ง๋กœ, Javascript ES5์—์„œ๋Š” var ํ‚ค์›Œ๋“œ๋งŒ์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ES6๋ถ€ํ„ฐ๋Š” let, const ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ var์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ ์žˆ๋‹ค.

var์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  1. function scope(ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ๋‹ค๋ฉด ์„ ์–ธ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์‚ฌ์šฉ์ด ๋จ)
  2. var ํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ
  3. ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ
  4. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

 

ํ•˜์ง€๋งŒ var์˜ ์ด๋Ÿฐ ํŠน์ง•๋“ค๋กœ ์ธํ•ด ๋ฌธ์ œ์ ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

 


 

var์˜ ๋ฌธ์ œ์ 

 

1. function-level scope

 

์ผ๋‹จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์Šค์ฝ”ํ”„์—๋Š” ์ „์—ญ์Šค์ฝ”ํ”„, ์ง€์—ญ์Šค์ฝ”ํ”„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

- ์ „์—ญ ์Šค์ฝ”ํ”„(global scope) : ์ฝ”๋“œ ์–ด๋””์—์„œ๋“  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ

- ์ง€์—ญ ์Šค์ฝ”ํ”„(local scope) : ์ •์˜๋œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ

 

์ฆ‰ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ๋ณ€์ˆ˜๋กœ ์ „์—ญ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜,

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

 

var ํ‚ค์›Œ๋“œ๋Š” function-level scope(ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„), let ํ‚ค์›Œ๋“œ๋Š” block-level scope(๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„)๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ๋‘˜๋‹ค ์ง€์—ญ์Šค์ฝ”ํ”„์— ์†ํ•œ๋‹ค.

 

1) ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ - var : ํ•จ์ˆ˜ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋งŒ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•ด์ฃผ๋ฉฐ, ํ•จ์ˆ˜ ์ž์‹ ๊ณผ ํ•˜์œ„ ํ•จ์ˆ˜์—์„œ๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ. ๊ทธ ์ด์™ธ์˜ ๋ธ”๋ก์—์„œ ์„ ์–ธํ•˜๋ฉด ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•จ. 

2) ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ - let : ๋ธ”๋ก(if๋ฌธ, for๋ฌธ, while๋ฌธ ๋“ฑ) ๋‚ด์— ์„ ์–ธ๋œ ์ง€์—ญ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•˜๊ฒŒ ํ•ด์คŒ

 

์ฆ‰, ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๋Š” var ํ‚ค์›Œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ธ”๋ก์ด๋ผ๋ฉด ๊ทธ ๋ฐ–์—์„œ๋„ ๋ธ”๋ก ๋‚ด var ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ์•„๋ž˜์˜ ๊ฒฝ์šฐ์—๋Š” ํ•จ์ˆ˜ ๋‚ด ์™ธ ์ „๋ถ€ var a๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ์ถœ๋ ฅํ•œ ๋ชจ์Šต์ด๋‹ค.

var a = 10;

function abcd() {
    var a = 'var';
    console.log(a);
}

abcd(); // ์ง€์—ญ๋ณ€์ˆ˜ 
console.log(a); // ์ „์—ญ๋ณ€์ˆ˜

 

 

function ๋‚ด์—์„œ๋„ a๊ฐ€ ์„ ์–ธ๋˜์—ˆ์œผ๋‚˜ ๊ทธ๋‚˜๋งˆ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ var a = 'var'๋กœ ํ• ๋‹นํ•œ ์ง€์—ญ๋ณ€์ˆ˜์ธ a์ด๊ธฐ ๋•Œ๋ฌธ์—,

ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜์„œ๋Š” ์‚ฌ๋ผ์ง€๊ณ  ์ „์—ญ๋ณ€์ˆ˜ a์˜ ๊ฐ’์ธ 10์ด ์ถœ๋ ฅ๋œ ๋ชจ์Šต์ด๋‹ค.

 

๋ฌธ์ œ๋Š” function ์™ธ์— if๋ฌธ, for๋ฌธ ๋“ฑ์˜ ๋‹ค๋ฅธ ๋ธ”๋ก๋“ค์—์„œ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋œ๋‹ค

 

for(var i = 0; i < 5; i++){
  console.log(i)
}
console.log('for๋ฌธ ๋');
console.log(i);

i++;
console.log(`i์˜ ๊ฐ’์€ ${i}`);

 

 

์ด์ฒ˜๋Ÿผ var๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๊ฒฝ์šฐ ๋‚ด ์˜๋„์™€ ๊ด€๊ณ„์—†์ด ์ „์—ญ๋ณ€์ˆ˜์˜ ๋‚จ๋ฐœ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

 

2. ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ

 

๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต์„ ์–ธ์„ ํ•  ๊ฒฝ์šฐ, ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๊นœ๋นกํ•˜๊ณ  ๋˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ’์ด ๊ฒฐ๊ตญ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

var aibao = "panda";
console.log(aibao);
var aibao = "wolf";
console.log(aibao);

 

์œ„์˜ ์˜ˆ์‹œ๋Š” 4์ค„๋ฐ–์— ์•ˆ๋˜๋Š” ์ฝ”๋“œ๋ผ ๋‹น์—ฐํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ์— 1000์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๊ธด ์ฝ”๋“œ์—์„œ ๋‚ด๊ฐ€ aibao์—๊ฒŒ 'panda'๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•œ ๊ฒƒ์„ ๊นŒ๋จน๊ณ  ๋˜ 'wolf'๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

let์˜ ๊ฒฝ์šฐ aibao๋Š” ์ด๋ฏธ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ, var๋กœ ์„ ์–ธํ•œ aibao๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋Š‘๋Œ€๊ฐ€๋œ๋‹ค... 

 

 

 

 

3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

 

ํ˜ธ์ด์ŠคํŒ…(hoisting)

์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ

=> ์ฆ‰, ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์‹œ์ ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ˜„์ƒ

 

์‚ฌ์‹ค var๋ฟ๋งŒ ์•„๋‹ˆ๋ผ let, const, function ๋“ฑ ๋ชจ๋“  ์‹๋ณ„์ž๋“ค์ด ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€๋งŒ, var๋งŒ ๋ฌธ์ œ์ธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

 

console.log(aibao); // undefined
var aibao = "panda";
console.log(aibao); // panda

 

 

1ํ–‰ : ์ฒ˜์Œ์— console.log(aibao);๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ด์ „,

        var aibao="panda";๊ฐ€ ํ˜ธ์ด์ŠคํŒ…๋˜์–ด aibao๊ฐ€ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ๋“ฑ๋ก๋˜๊ณ  ๊ฐ’์€ undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. 

2ํ–‰ : ์ดํ›„ var aibao = "panda"๋กœ ๊ฐ’์ด ํ• ๋‹น๋˜๊ณ ,

3ํ–‰ : ๋งˆ์ง€๋ง‰์— console.log(aibao);์—์„œ panda๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

๋ฌผ๋ก  let๋„ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€๋งŒ, var์™€๋Š” ๋‹ฌ๋ฆฌ ์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

javascript๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋˜๋Š”๋ฐ, var์™€ ๋‹ฌ๋ฆฌ let์€ ์„ ์–ธ์ด ์•ˆ๋œ ์ƒํƒœ์—์„œ ๊ฐ’์— ์ ‘๊ทผํ• ๋•Œ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด TDZ(Temporal Dead Zone, ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€)๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. 

 

 


 

 

์ด๋Ÿฌํ•œ ์ด์œ ๋“ค์ด ์žˆ์–ด var๋Š” ์ด์ œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ตณ์ด ์“ธ ํ•„์š”์กฐ์ฐจ ์—†์–ด์กŒ๋‹ค.