전역과 지역 스코프
- 전역 스코프
- 지역 스코프
var x = 'global x';
var y = 'global y';
function outer () {
var z = "outer's local z";
console.log(x); // global x
console.log(y); // global y
console.log(z); // outer's local z
function inner () {
var x = "inner's local x";
console.log(x); // inner's local x
console.log(y); // global y
console.log(z); // outer's local z
}
inner();
}
outer();
console.log(x); // global x
console.log(y); // global y
console.log(z); // ReferenceError: z is not defined 전역에는 z가 없다
- 스코프 체인
함수 레벨 스코프
// i는 전역 변수
var i = 0;
// 전역 변수로 이미 선언 된 i가 중복 선언 된다.
for(var i = 0; i < 10; i++) {}
// for 코드 블럭 내부의 값 변화가 반영된다.
console.log(i);
var
ES5까지 변수를 선언할 수 있는 유일한 방법은 var 키워드를 사용하는 것이었는데 이는 몇가지 문제를 유발한다.
1. 변수 중복 선언
- var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언이 허용된다.
- 초기화 문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 행동한다.
- 초기화 문이 없는 변수 선언문은 무시된다.
var msg = "안녕하세요";
console.log(msg); // 안녕하세요
var msg = "안녕히가세요";
console.log(msg); // 안녕히가세요
var msg;
console.log(msg); // 안녕히가세요
2. 함수 레벨 스코프
3. 변수 호이스팅
- 변수 선언문이 스코프의 선두로 끌어올려진 것처럼 동작하여 변수 선언문 이전에 참조할 수 있다.
console.log(test); //undefined
test = "반갑습니다";
console.log(test); //반갑습니다
var test;
let
var 키워드의 단점을 보완하기 위해 ES6에서는 새로운 변수 선언 키워드인 let, const를 도입했다.
1. 변수 중복 선언 금지
- 같은 스코프 내에서 중복 선언을 허용하지 않는다.
let msg = "안녕하세요";
let msg = "안녕히가세요"; -> 블록 범위 변수 'msg'을(를) 다시 선언할 수 없습니다.
2. 블록 레벨 스코프
- 모든 코드 블록을 지역 스코프로 인정한다.
let i = 0;
for(let i = 0; i < 10; i++) {
console.log(`지역 변수 i : ${i}`); // 0~10 출력
}
console.log(`전역 변수 i : " ${i}`); // 전역 변수 i : 0
3. 변수 호이스팅
- 변수 호이스팅이 발생하지 않은 것처럼 동작한다.
console.log(x); //ReferenceError: Cannot access 'x' before initialization
let x;
* var : 선언, 초기화 동시 / let : 선언, 초기화 분리되어 동작
const
let 키워드에서 알아본 특징은 모두 동일하며, 상수(const) 선언에서만 사용된다는 점이 특징이다.
- const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.
- const 키워드로 선언한 변수는 재할당 금지
const x; // 'const' 선언은 초기화해야 합니다.
const x = 1;
x = 2; // TypeError: Assignment to constant variable.
- 일반적으로 상수의 이름은 대문자로 선언해 상수임을 나타내며, 여러 단어로 이루어진 경우 _(언더스코어)로 구분해서 스네이크 케이스로 표현하는 것이 일반적이다.
const DISCOUNT_RATE = 0.15;
- const 키워드로 선언된 변수에 객체를 할당할 경우 프로퍼티 값을 변경할 수 있다.
- 객체 재할당은 불가능하다.
const student = {
name : '홍길동',
age : 20
};
student.name = '유관순';
console.log(student); // { name: '유관순', age: 20 }
student = {}; // TypeError: Assignment to constant variable.
'LECTURE > JavaScript' 카테고리의 다른 글
프로토타입 - 상속, 생성자 함수 프로토타입, Object 프로토타입, 모던 메소드 (0) | 2023.02.09 |
---|---|
Object 생성자 함수 (0) | 2023.02.08 |
Function - 화살표 함수, 즉시 실행 함수, 재귀 함수, 중첩 함수, 콜백 함수, 순수 함수와 비순수 함수 (0) | 2023.02.07 |
Function - 함수의 표현식, 함수 호이스팅, 매개변수와 인수, 반환문, 일급 객체 (0) | 2023.02.07 |
Object literal - ES6 , in 연산자, for in 반복문 (0) | 2023.02.07 |