Javascript
함수
일반함수
직접 호출할 수 있는 이름이 존재하는 함수
function a1(){
console.log(`a1 함수 호출~~`);
}
a1();
익명함수
이름은 존재하지 않으나 간접적으로 함수를 작동시킬 수 있는 함수
var a2 = function(){
console.log(`a2 함수 호출~~!`);
}
a2();
var, let, const 비교
일단 그 전에 ..
스코프란?
{ } : 스코프(scope) - 하나의 메모리 공간이며, 실행 공간
if(조건식){실행문}
function(){실행문}
객체 = {key1 : value1, key2 : value2, key3 : function(){}, ... }
이렇게 실행문이 쓰이는 곳
또한 전역변수와 지역변수는 상대적인 것!
그리고 호이스팅(hoisting)이란
인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미
🎈 변수 var
var boul = "샐러드"; // boul 그릇에 "샐러드"
console.log(boul);
var boul = "해장국"; // 기존 boul 그릇에 "해장국" 으로 바꿔버림
console.log(boul);
기존 샐러드가 담겨있는 그릇을 냅다 해장국이 담겨있는 그릇으로 바꿈;
사실 이게 더 편한게 아니야? 라는 미친 생각을 했는데
코드가 길어질수록 변수명을 까먹고 새로 작성해도
에러가 안난다는 거니까 너무 위험함 ..
var - 조건식에 변수선언 (조건식에서는 구분X)
var msg1 = "hello"; // 전역변수
console.log(msg1); // hello
if(12>10){
var msg1 = "Good Luck"; // 지역변수
console.log(msg1); // Good Luck
}
console.log(msg1); // Good Luck
var - 함수에서의 변수선언 (함수에서는 구분O)
var msg2 = "nice"; // 전역변수
console.log(msg2); // nice
// 함수구문
function printOut1(){
var msg2 = "thank you"; // 지역변수
console.log(msg2);
}
// 함수호출
printOut1(); // thank you
console.log(msg2); // nice
즉, 동일한 스코프 영역을 선언했음에도 불구하고 전역변수의 영향을 받는다.
스코프의 역할과 위치마다 선언된 변수값을 일정하게 가져오지 못함
이것이 ... let과 const의 생성하게된 원인
🎈 변수 let
let - 조건식에 변수선언 (조건식에서는 구분O)
let msg3 = "hello"; // 전역변수
console.log(msg3); // hello
if(12>10){
let msg3 = "Good Luck"; // 지역변수
console.log(msg3); // Good Luck
}
console.log(msg3); // hello
let - 함수에서의 변수선언 (함수에서는 구분O)
let msg4 = "nice"; // 전역변수
console.log(msg4); // nice
// 함수구문
function printOut2(){
let msg4 = "thank you"; // 지역변수
console.log(msg4); // thank you
}
// 함수호출
printOut2(); // thank you
console.log(msg4); // nice
→ 확실한 전역 공간에 선언된 변수의 값을 가져온다.
🎈 변수 const
const - 조건식에 변수선언 (조건식에서는 구분O)
const msg5 = "hello"; // 전역변수
console.log(msg5); // hello
if(12>10){
const msg5 = "Good Luck"; // 지역변수
console.log(msg5); // Good Luck
}
console.log(msg5); // hello
const - 함수에서의 변수선언 (함수에서는 구분O)
const msg6 = "nice"; // 전역변수
console.log(msg6); // nice
// 함수구문
function printOut3(){
const msg6 = "thank you"; // 지역변수
console.log(msg6);
}
// 함수호출
printOut3(); // thank you
console.log(msg6); // nice
→ 확실한 전역 공간에 선언된 변수의 값을 가져온다.
🎈 var와 let의 상세 비교
if(true){
var age1 = 20;
console.log(`1. 당신의 나이는 : ${age1}` ); // 1. 당신의 나이는 : 20
}
console.log(`2. 당신의 나이는 : ${age1}` ); // 2. 당신의 나이는 : 20
if(true){
let age2 = 21;
console.log(`1. 당신의 나이는 : ${age2}`); // 1. 당신의 나이는 : 21
}
//console.log(`2. 당신의 나이는 : ${age2}`); // not defined
var는 중복 선언 가능
let은 중복 선언 불가능
🎈 var와 let의 혼합
if(true){
var age3 = 22;
console.log(`1. 당신의 나이는 : ${age3}`); // 1. 당신의 나이는 : 22
}
//let age3 = 24;
//console.log(`2. 당신의 나이는 : ${age3}`); // SyntaxError
즉, var와 let도 겹치면 안된당
if(true){
let age4 = 25;
console.log(`1. 당신의 나이는 : ${age4}`); // 1. 당신의 나이는 : 25
}
var age4 = 27;
console.log(`2. 당신의 나이는 : ${age4}`); // 2. 당신의 나이는 : 27
동일한 변수명을 갖고 있는 상태 (let)
//let cart = "아이비";
//let cart = "참크래커"; // SyntaxError : already been declared
//console.log(cart);
let cart = "아이비";
cart = "참크래커";
console.log(cart); // 참크래커
let은 데이터 변동 쌉가능
🎈 const 상세 비교
const num1 = 20;
//num1 = 24; // TypeError: Assignment to constant variable
//console.log(num1);
const는 상수
즉, 변경할 수 없는 함수구문, 배열, 객체 (대입 가능한 형태, 외곽이 변경되지 않은 데이터)
📃 정리
var | 중복 선언 가능 → 가장 마지막껄로 초기화 |
let | 중복 선언 불가능 + 초기화는 가능 |
const | 중복 선언 불가능 + 초기화도 불가능 |
var는 함수 레벨의 scope
let, const 는 블럭 레벨의 scope
var의 경우 호이스팅이 되면서 초기 값이 없으면 자동으로
undefined를 초기 값으로 하여 메모리 할당.
그래서 선언 전에 해당 변수를 사용하려고 해도
메모리에 해당 변수가 존재하기 때문에 에러발생X
let, const의 경우 호이스팅이 되면서 초기 값이 없다면 자동으로
초기값 할당하지 않음
(const의 경우 초기값 할당하지 않으면 에러)
즉, var의 경우 버그 발생과 메모리 누수의 위험이 있어서
값을 재할당할 필요가 있으면 let
없으면 const를 쓰자
현업에서도 var는 점점 쓰지 않는 추세..!
'🧠 저장 > Javascript' 카테고리의 다른 글
Javascript - 이벤트 (0) | 2022.09.13 |
---|---|
Javascript - 화살표 함수, 호이스팅 (0) | 2022.09.02 |
Javascript - 배열과 객체, 전개연산자 (0) | 2022.09.01 |
Javascript - 템플릿, 삼항조건연산자 (0) | 2022.08.30 |
Javascript - DOM, 이벤트처리 (0) | 2022.08.20 |