JS Variables

var, let, const๋Š” ๋ชจ๋‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•ด๋†“์€ ๋งŒํผ ์ฐจ์ด์ ์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•ด๋ณด์ž

1๏ธโƒฃ var

๊ฐ€์žฅ ๋จผ์ € ๋“ฑ์žฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์ด๋‹ค.

var name = "augusstt"
console.log(name) ; // augusstt

var name = "kuku";
console.log(name) // kuku

name = "test"
console.log(name) // test

์ฒซ๋ฒˆ์งธ ํŠน์ง•์€ ์˜ˆ์‹œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋™์ผํ•œ ๋ณ€์ˆ˜์ด๋ฆ„์œผ๋กœ ์ค‘๋ณต์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ํ• ๋‹น๋œ ๊ฐ’์ด ๋ณ€์ˆ˜์— ์ตœ์ข…์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

๋‘๋ฒˆ์งธ ํŠน์ง•์€ ํ•จ์ˆ˜๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฆ‰ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋งŒ์„ ์ง€์—ญ๋ณ€์ˆ˜, ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.

function test_var(){
	var f_scope = "ํ•จ์ˆ˜๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„";
    console.log(f_scope);
}

test_var(); // ํ•จ์ˆ˜๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„
console.log(f_scope) // ReferenceError : f_scope is not defined

if (true){
	var not_f_scope = "ํ•จ์ˆ˜๊ฐ€ ์•„๋‹๊ฒฝ์šฐ";
    console.log(not_f_scope) // ํ•จ์ˆ˜๊ฐ€ ์•„๋‹๊ฒฝ์šฐ
}
console.log(not_f_scope); // ํ•จ์ˆ˜๊ฐ€ ์•„๋‹๊ฒฝ์šฐ

ํ•จ์ˆ˜๋‚ด๋ถ€์— ํ•œ์ •ํ•˜์—ฌ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋ถ€๋ถ„์—์„œ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ๊ด€ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์„ ๋ชจ์•„์„œ ์ตœ์ƒ๋‹จ์— ์„ ์–ธํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์œ ์˜ํ•  ์ ์€ ์‹ค์ œ๋กœ ์ฝ”๋“œ๊ฐ€ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ parser ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.

console.log(hoisting_var); // undefined

var hoisting_var = "var ํ˜ธ์ด์ŠคํŒ…";

console.log(hoisting_var); // var ํ˜ธ์ด์ŠคํŒ…

var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ hoisting_var๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ์ฐธ์กฐ๋˜์—ˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ๋ฏธ๋ฆฌ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„ undefined๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด๋‘์–ด ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค..

์–ธ๋œป ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ณ„ ์ œ์•ฝ์ด ์—†๊ธฐ์— ํŽธํ•ด๋ณด์ด์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์ค‘๋ณต์„ ์–ธ๊ณผ ์ „์—ญ๋ณ€์ˆ˜ ์ทจ๊ธ‰์˜ ๋ฌธ์ œ๋กœ ๊ฐ’์˜ ๋ณ€๊ฒฝ/์—๋Ÿฌ๋“ฑ์ด ์–ด๋””์„œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด let๊ณผ const๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค.

2๏ธโƒฃ let

ES6๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์ด๋‹ค.

let name = "augusstt";
console.log(name) // augusstt

let name = "kuku";
console.log(name) // Uncaught SyntaxError : Identifier 'name' has already been declared

name = "test";
console.log(name) // test

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด var์™€์˜ ์ฐจ์ด์ ์ด ํ•œ๋ˆˆ์— ๋ณด์ธ๋‹ค.

์ค‘๋ณต ์„ ์–ธ์€๋ถˆ๊ฐ€๋Šฅ ํ•˜์ง€๋งŒ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ ๋ธ”๋ก๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋กœ์จ var์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ if, while, for๋“ฑ์˜ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋Š” ์ง€์—ญ๋ธ”๋ก๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ• ์ˆ˜ ์—†๋‹ค.

if (true){
	let block_scope = "let์€ ๋ธ”๋Ÿญ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค.";
    console.log(block_scope);
}
conole.log(block_scope) // ReferenceError : block_scope is not defined

ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฒฝ์šฐ, var์™€ ๋‹ฌ๋ฆฌ ์ฝ”๋“œ ์‹คํ–‰์ „์—๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋งŒ ์‹ค์‹œํ•˜๊ณ , ์ดˆ๊ธฐํ™”๋Š” ์‹คํ–‰๊ณผ์ •์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋งŒ๋‚ฌ์„๋•Œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰, ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ฐ’์„ ์ฐธ์กฐํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

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

let hoisting_let = "let ํ˜ธ์ด์ŠคํŒ…";

console.log(hoisting_let); // let ํ˜ธ์ด์ŠคํŒ…

3๏ธโƒฃ const

๋งˆ์ง€๋ง‰ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฐฉ์‹์ธ const์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” let๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด

๋ณ€์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.

const name = "augusstt";
console.log(name); // augusstt

const name = "kuku";
console.log(name); // //Uncaught SyntaxError: Identifier 'name' has already been declared

name = "test";
// Uncaught SyntaxError: Identifier 'name' has already been declared

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

const test : {
	name : "augusstt",
    age : 20
}

// ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ’์˜ ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
test = {
	name : "๊ฐ’ ๋ณ€๊ฒฝ",
    age : 2
} // error:  Assignment to constant variable.

// ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
test.age = 25;

ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฒฝ์šฐ let๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.


++using

TypeScript์—์„œ ์ถ”๊ฐ€๋œ ํ‚ค์›Œ๋“œ์ด๋‹ค. ๋”ฐ๋กœ ํฌ์ŠคํŒ…์„ ํ•ด์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ˆ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœ์ •๋„๋งŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ ํ•œ๋‹ค.

using์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด๋‚˜ ํŒŒ์ผ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ let, const๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

๋จผ์ € using์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

function writeFile(path:string) {
  const file = fs.openSync(`files/${path}`, 'w+')

  fs.writeFileSync(file, "Text/n")

  if(path.includes("temp")) {
  	fs.closeSync(file)
    return
  }

  fs.writeSync(file, "Permanent")
  fs.closeSync(file)
}

writeFile("a.txt")
writeFile("temp.txt")

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด if๋ฌธ ์•„๋ž˜์—์„œ ๋งŒ์•ฝ temp.txt๋ผ๋Š” ํŒŒ์ผ์ผ ๊ฒฝ์šฐ์™€ ์•„๋‹ ๊ฒฝ์šฐ ๋ชจ๋‘ ํŒŒ์ผ์„ ๋‹ซ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ if๋ฌธ ์•ˆ์—์„œ fs.closeSync(file)์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๊ฒฝ์šฐ์— ํŒŒ์ผ์„ ๋‹ซ์ง€ ์•Š๊ณ  returnํ•ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ ์ฝ”๋“œ ๋ธ”๋ก ์ค‘๊ฐ„์—์„œ ์ข…๋ฃŒ๋ฅผ ์‹œ์ผœ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์œ„์น˜์— ๋ชจ๋‘ ์ข…๋ฃŒ๋ฅผ ์‹œ์ผœ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

using์€ ๋ฐ”๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ๋ฅผ using์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•ด๋ณด์ž

function openFile(){
	const file = fs.openSync(`files/${path}`, 'w+);
    return {
    	handle : file,
        [Symbol.dispose] () {
        	console.log("Disposed");
            fs.closeSync(file)
        }
    }
};

๋จผ์ € ๋‹ค๋ฃฐ ํŒŒ์ผ์„ ์—ฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด๋•Œ Symbol.dispose๋ผ๋Š” global symbol์ด ์†์„ฑ์œผ๋กœ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ฆฌ์†Œ์Šค๋กœ ํŒ๋‹จ๋˜์–ด ์„ ์–ธ์ ์œผ๋กœ usingํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ• ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

function writeFile(path : string){
	using file = fs.openSync(`files/${path}`, 'w+')

    fs.writeFilesync(file.handle, "Permanent");

    if (path.includes("temp")){
    	return ;
    }
    fs.writeSync(file.handle, "Permanent")
}
writeFile("a.txt");
writeFile("temp.txt");

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

Last updated