javascript - scope
scope
- 변수 접근 규칙에 따른 유효 범위
Lexical scope & Dynamic scope
- Lexical scope : 유효범위가 코드를 작성할 때 결정됨
- Dynamic scope : 유효범위가 실행 순서에 의해 결정됨
Local scope & Global scope
- 하위 scope에서 상위 scope의 변수에 접근 가능
- Local scope가 Global scope보다 높은 우선순위를 가짐
function level scope & block level scope
- ES5 version에서는 function level scope를 가짐(var)
var name = 'Richard';
function showName() {
var name = 'Jack';
console.log(name);
}
console.log(name); // Richard
showName(); // Jack
console.log(name); // Richard
- ES6 version에서는 block level scope를 가짐(let, const)
for(let i = 0; i < 5; i++) {
console.log(i);
}
console.log(i); // Reference Error
window
- 전역범위를 대표하는 객체
- 모든 전역변수는 window객체와 연결(let, const는 X)
- 선언 없이 초기화된 변수는 전역 변수
var name = 'Paul';
console.log(window.name); // Paul
console.log(name === window.name); // true
Hoisting
- 변수 선언은 범위에 따라 선언과 할당으로 분리됨
- Javascript 엔진이 내부적으로 변수 선언을 scope의 상단으로 끌어올림(hoist)
- 함수선언식은 항상 상단으로, 함수표현식은 할당된 변수만 상단으로 Hoisting
a = 2;
var a;
console.log(a); // 2
console.log(a); // undefined
var a = 2;
/* 함수선언식 */
show(); // displayed
function show() {
console.log('displayed');
}
/* 함수표현식 */
show2(); // TypeError : show2 is not a function
var show2 = function() {
console.log('displayed');
}