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