1. 변수(variable)
- 변수: 자료를 임시로 저장하는 공간
- 오브젝트, 배열, 함수 등 모든 자료들을 담을 수 있음
- 자바 스크립트에서 변수를 만들 때 var, let, const라는 3개 키워드를 사용할 수 있음
var | let | const | |
재선언 | O | X | X |
재할당 | O | O | X |
범위 | function | {} | {} |
2. 변수의 선언
1) 선언 방법
var 이름;
let 나이;
const 성별;
2) 차이점: var는 재선언 가능 / let, const는 재선언 불가능
- let, const로 만들면 같은 이름의 변수 재선언 불가(에러 발생)
- 변수 이름을 중복해서 만드는 실수를 방지해 줌
let 나이;
let 나이; //에러
const 성별 = '여자';
const 성별 = '남자'; //에러
3. 변수의 값 할당
- 이름이라고 선언된 변수에 'Kim' 이라는 값을 집어넣는걸 할당이라고 함
var 이름;
이름 = 'Kim';
- 할당과 선언 동시에 가능
var 이름 = 'Kim';
- 변수를 var, let으로 만들면 재할당 가능, const로 만들면 값 재할당 불가능 => const 변수로 만들면 값 변경 불가
- const는 constant의 약자로 바뀌지 않는 일정한 값을 뜻 함(바뀌면 안되는 값을 저장할 때 사용하면 됨)
let 이름 = 'Kim';
이름 = 'Park'; //가능
const 나이 = 30;
나이 = 40; //에러
- const 변수에 오브젝트를 담으면 오브젝트 내의 데이터는 변경 가능
const 오브젝트 = { 이름 : 'Kim' }
오브젝트.이름 = 'Park'; //가능
왜? 변수를 재할당한게 아니기 때문에 가능
- 완전 변경불가능한 오브젝트를 만들고 싶다면 Object.freeze()라는 자바스크립트 기본함수 사용
Object.freeze() 소괄호에 오브젝트를 담으면 불변의 Object 완성(하지만 오브젝트 내의 오브젝트까지 freeze해주진 않음)
4. 변수의 범위
- 변수는 존재 범위가 있음
- var 변수는 존재 범위가 function
function 함수(){
var 이름 = 'Kim';
console.log(이름); //가능
}
console.log(이름); //에러
▲ var 변수는 function 내에서 만들면 function 내에서만 사용 가능 (function 밖에서 호출 시 정의되지 않은 함수라고 에러 발생)
- let, const 변수는 존재범위가 거의 모든 {중괄호} . (for, if, function 등)
if ( 1 == 1 ){
let 이름 = 'Kim';
console.log(이름); //가능
}
console.log(이름); //에러
▲ let 변수는 {} 중괄호 내에서 만들면 중괄호 내에서만 사용 가능(중괄호 밖에서 호출 시 정의되지 않은 함수라고 에러 발생)
5. 변수와 함수의 Hoisting
- 자바스크립트는 변수나 함수를 선언하면 Hoisting이라는 현상 발생
Hoisting: 자바스크립트에서 변수나 함수의 선언부분을 변수의 범위 맨 위로 강제로 끌고가서 가장 먼저 해석하는 것 |
함수() 내에 var 이름 이라는 변수 선언 및 할당
function 함수(){
console.log('hello');
var 이름 = 'Kim';
}
(우리 눈에 보이지 않지만)자바스크립트가 이 코드를 해석하는 순서
function 함수(){
var 이름;
console.log('hello');
이름 = 'Kim';
}
Hoisting 예제
- 작성한 코드
<script>
console.log(이름);
var 이름 = 'Kim';
console.log(이름);
</script>
- 자바스크립트 코드 실행 순서
var 이름;
console.log(이름);
이름 = 'Kim'
console.log(이름);
- 출력 결과
undefined - 변수가 선언은 되었는데 값을 아무것도 할당하지 않았을 때 undefined 출력 - 일종의 자료형같은 것인데 그냥 정해지지않은 값이라고 생각하면 됨 |
let, const 변수의 경우 Hoisting이 일어나긴 하는데 약간 이상한 방식으로 일어납니다.
6. 변수 여러개 편리하게 만들기
- 변수를 콤마로 구분하면 여러개를 동시에 만들 수 있음
var 이름, 나이, 성별;
▲ var 키워드 1번 쓰고 변수 3개 생성
var 이름 = 'Kim', 나이, 성별;
▲ 선언과 동시에 할당 가능
7. 전역변수와 변수의 참조
1) closure: 바깥에 있는 변수는 안쪽에서 자유롭게 사용 가능(참조 가능)
var 나이 = 20;
function 함수(){
console.log(나이)
}
함수();
- 함수(){} 안쪽에서 바깥쪽에 있는 '나이'라는 변수를 가져다 쓸 수 있음
- 함수(){} 안쪽에 '나이;라는 변수 정의가 있으면 그걸 쓰겠지만 없으면 자연스럽게 바깥에 있는 변수 참조
2) 전역변수
- 모든 함수나 if나 for 내부에서 공통적으로 사용할 수 있는 (참조할 수 있는) 변수
- 전역변수를 만들어 쓰고싶으면 그냥 script태그 내부에 변수를 선언하면 됨
<script>
var 나이 = 20;
function 함수(){
console.log(나이)
}
</script>
▲ 변수 선언 후 밑에 나오는 모든 함수, for, if 등에서 전부 '나이'라는 변수 사용
3) 전역변수의 특징
- 전역변수를 만들면 window오브젝트에도 보관됨(var 키워드만)
- 전역함수도 마찬가지로 window에 자동으로 보관됨
<script>
var 나이 = 20;
console.log(나이);
console.log(window.나이);
</script>
▲ '나이'라는 전역변수를 만들면 자동으로 window 오브젝트에 보관이 되었으니까 window.나이를 써도 출력 됨
- 전역변수를 조금 더 엄격하게 관리하거나 구분짓고 싶으면 전역변수를 만들 때와 사용할 때 window를 활용할 수 있음
<script>
window.나이 = 20; //전역변수만들기
console.log(window.나이); //전역변수사용하기
window.나이 = 30; //전역변수변경하기
</script>
cf)node.js 환경에선 window 대체품인 global 이라는 오브젝트가 있음
'Front-end > JavaScript' 카테고리의 다른 글
[JavaScript] 자바스크립트 기본 - 자료형 (0) | 2023.10.23 |
---|---|
[JavaScript] 템플릿 리터럴(Template literals), 태그드 리터럴(tagged literals) (0) | 2023.07.01 |
[JavaScript] Arrow function 화살표 함수 (0) | 2023.07.01 |
[JavaScript] this 키워드 (0) | 2023.07.01 |
[JavaScript] <script> 위치에 따른 동작 순서 (0) | 2023.05.23 |