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

[JavaScript] var, let, const ๋น„๊ต - var is used instead of let or const

by ynzu๐Ÿค 2022. 1. 24.
๋ฐ˜์‘ํ˜•
 

 

์ธํ…”๋ฆฌ์ œ์ด๋ฅผ ์ž‘๋…„์— ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ํ‰์†Œ์ฒ˜๋Ÿผ var์„ ์‚ฌ์šฉํ–ˆ๋”๋‹ˆ'var is used instead of let or const' ๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์—ฌ์กŒ๋‹ค.
 
๋ฉ”์‹œ์ง€๋ฅผ ๋ฒˆ์—ญํ•ด๋ณด๋ฉด 'var'๋Œ€์‹  'let'์ด๋‚˜ 'const'๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. sts๋ฅผ ์‚ฌ์šฉํ•  ๋• ์ €๋Ÿฐ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•˜๋Š”๋ฐ ์™œ  'var'๋Œ€์‹  'let'์ด๋‚˜ 'const'๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š”๊ฑด์ง€ ์„œ์น˜ํ•ด๋ณด์•˜๋‹ค!
 
es6๋ถ€ํ„ฐ๋Š” var๋Œ€์‹  ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  var์‚ฌ์šฉ์„ ๋ชปํ•˜๋Š” ๊ฑด ์•„๋‹ˆ์ง€๋งŒ  ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ์ƒˆ๋กœ์šด ํ‘œ์ค€์— ๋งž๊ฒŒ ๊ฐœ๋ฐœํ•˜๋ผ๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋„์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์˜ ๋งŽ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ•์ขŒ์—์„œ๋„ ๊ฐ€๊ธ‰์  var ๋Œ€์‹ ์— let์ด๋‚˜ const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ผ๊ณ  ๊ฐ€์ด๋“œํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค!

( es6๋ž€? ECMA๋ผ๋Š” ๊ตญ์ œ ๊ธฐ๊ตฌ์—์„œ ๋งŒ๋“  ํ‘œ์ค€๋ฌธ์„œ์ธ ECMAScript(=ES)์˜ 6๋ฒˆ์งธ ๊ฐœ์ •ํŒ ๋ฌธ์„œ์— ์žˆ๋Š” ํ‘œ์ค€ )


 

var๊ณผ let, const์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด๋ณด์ž!

1.  var๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ๋˜ ์„ ์–ธํ–ˆ๋Š”๋ฐ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™๋ ์ง€  ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 
 
var value = 'test1'
console.log(value) // test1 ์ถœ๋ ฅ

var value = 'test2'
console.log(value) // test2 ์ถœ๋ ฅ

 

let์ด๋‚˜ const์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ์„ ์–ธ๋˜์—ˆ๋‹ค๋Š” ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.  ์ฆ‰, ๋ณ€์ˆ˜์˜ ์žฌ์„ ์–ธ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค!

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๋ณด๋ฉด chrome์˜ ๊ฒฝ์šฐ Uncaught SyntaxError: Identifier 'value' has already been declared ๋ผ๋Š” ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ ,  IE์˜ ๊ฒฝ์šฐ SCRIPT1052: Let/Const ๋‹ค์‹œ ์„ ์–ธ ์ด๋ผ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

์ฐธ๊ณ ๋กœ  let, const์€  immutable์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฅด๋‹ค!

  • let์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜์˜ ์žฌ์„ ์–ธ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ๋ณ€์ˆ˜์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค.
let value = 'test1';
console.log(value); // test1 ์ถœ๋ ฅ

value = 'test2';
console.log(value); // test2 ์ถœ๋ ฅ

 

  • const๋Š” ๋ณ€์ˆ˜์˜ ์žฌ์„ ์–ธ, ๋ณ€์ˆ˜์˜ ์žฌํ• ๋‹น ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
const value = 'test1';
console.log(value); // test1 ์ถœ๋ ฅ

value = 'test2';
console.log(value); // Uncaught TypeError: Assignment to constant variable.

 

 
2. ๋‹ค์Œ์œผ๋กœ var๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์–ธ์ œ๋‚˜ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , let์€ ReferenceErrorr๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , const๋Š” 

SyntaxErrorr๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” var, let, const, function, class ๋“ฑ์€ ๋ชจ๋‘ ํ˜ธ์ด์ŠคํŒ…์ด ๋œ๋‹ค. var์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ…๋  ๋•Œ ์ดˆ๊ธฐ ๊ฐ’์ด ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ undefined๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ ์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋ฐ˜๋ฉด let, const์˜ ๊ฒฝ์šฐ ์ดˆ๊ธฐ ๊ฐ’์ด ์—†์„ ๋•Œ var์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.

console.log(value1); // undefined
var value1;

console.log(value2); // Error: Uncaught ReferenceError: value2 is not defined
let value2;

consol.log(value3); //Uncaught SyntaxError: Missing initializer in const declaration
const value3;
 

์ฆ‰,  var๋Š” ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง€๋ฉฐ, let์€ ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋œ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์ž!

๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜์— ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „๊นŒ์ง€๋ฅผ TDZ(Temporal Dead Zone)๋ผ๊ณ  ํ•˜๋ฉฐ, ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ๋‹จ๊ณ„ -> ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ -> ํ• ๋‹น ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์ƒ์„ฑ๋œ๋‹ค.

//์„ ์–ธ๋‹จ๊ณ„์™€, ์ดˆ๊ธฐํ™” ๋‹จ๊ฒŒ๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ ธ, ๋ณ€์ˆ˜ ์„ ์–ธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
console.log(value) // undefined ์ถœ๋ ฅ

var value;
console.log(value) // undefined ์ถœ๋ ฅ

value = 'test1'; //ํ• ๋‹น ๋‹จ๊ณ„
console.log(value) // test1 ์ถœ๋ ฅ

////////////////////////////////////////////////////

//์„ ์–ธ ๋‹จ๊ณ„๋งŒ ์‹คํ–‰๋˜์–ด ์•„์ง ๋ณ€์ˆ˜๊ฐ€ undefined๋กœ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•„ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.
console.log(value) // ReferenceError: value is not defined

let value; //์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ์‹คํ–‰
console.log(value) // undefined ์ถœ๋ ฅ

value = 'test1'; //ํ• ๋‹น ๋‹จ๊ณ„
console.log(value) // test1 ์ถœ๋ ฅ

 

๊ฒฐ๋ก !

var๋Š” hosting๊ณผ scope๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ฝ”๋”ฉํ•ด์•ผํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜ ๋ฐ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—” let์„ ์‚ฌ์šฉํ•˜๊ณ , ์žฌํ• ๋‹น์ด ํ•„์š”์—†๋Š” ์ƒ์ˆ˜์™€ ๊ฐ์ฒด๋Š” const๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค.

  var let const
grobal scope yes no no
script scope no yes yes
function local scope yes yes yes
block scope no yes yes
์žฌ์„ ์–ธ yes no no
์žฌํ• ๋‹น yes yes no

scope๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ž์„ธํ•˜๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ๋””๋ฒ„๊น…ํ•ด๋ณด์ž!

 

 
 

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] var๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค

Engineering Blog by Dale Seo

www.daleseo.com

 

 

728x90
๋ฐ˜์‘ํ˜•

'๊ฐœ๋ฐœ > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Ajax] ํŒŒ์ผ file ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ธฐ  (6) 2021.11.30

๋Œ“๊ธ€