2020. 5. 16. 00:07ㆍjavascript/Basic Conception
Scope
스코프란 각 변수를 참조할 수 있는 범위를 나타냅니다. 한마디로 해당 변수를 사용할 수 있나 없나를 의미한다.
Lexical Scope
js의 경우 각 변수들의 스코프가 결정될 때는 함수가 호출될 때가 아닌 선언될 때이다. 그래서 아래의 결과로 1이 호출된다.
함수가 선언될때 x의 스코프가 결정되기 때문에 bar는 가장 바깥의 x에 접근하게 된다.
let x = 1;
function foo() {
let x = 10;
bar();
}
function bar() {
console.log(x);
}
foo();
bar();
Global Scope
어디서든지 접근하여 변수를 사용할 수 있다. 가장 최상위 단의 scope이다.
var a = 1;
function hi(){
console.log(a);
}
hi();
1이 출력될 것이다.
js에서 변수를 선언할 수 있는 방법은 세가지가 있는데 var, let, const가 있다. let, const는 es6부터 생겼는데
Var
var는 함수 스코프이다. 함수 기준으로 스코프가 형성된다는 의미이다.
var a = 1;
function ab(){
var a = 3;
console.log(a);
}
ab();
console.log(a);
ab()에서는 3을 출력하고 제일 밑에서는 1을 출력한다. 함수를 기준으로 서로 다른 scope로 구분되어서 이와 같은 결과가 나온다.
그래서 아래와 같은 경우에는 서로 같은 스코프로 인식하여 모두 3이 출력된다.
var a = 1;
if(true){
var a = 3;
console.log(a);
}
console.log(a);
let, const
let, const는 block을 기준으로 scope를 만듭니다. 그래서 아래와 같은 경우에는 3, 1이 출력된다.
let a = 1;
if(true){
let a = 3;
console.log(a);
}
console.log(a);
주의할 점
scope에 있는 변수들을 참조할 때 참조하려는 변수가 없으면 더 큰 scope에서 찾은 후 있으면 사용한다. 하지만 반대의 경우에는 error가 발생한다.
아래의 예를 보면 바로 이해가 될 것이다.
let a = 1;
if(true){
console.log(a);
}
console.log(a);
1과 1이 출력된다. if(true)안의 scope에서는 a가 없기 때문에 밖의 scope에서 찾은 후 let a = 1;을 참조하는 것을 알 수 있다.
반대의 경우에는 어떻게 될까?
if(true){
let a = 1;
}
console.log(a);
if문안의 a를 선언해준 후 밖에서 참조하려고 하는데 안에 값을 참조할 수 없어서 오류가 발생한다.
요약하자면 안에서 밖의 스코프를 참조할 수 있지만 밖에서 안의 스코프를 참조할 수 없다. 이 점을 유의하자!!
'javascript > Basic Conception' 카테고리의 다른 글
javascript 33가지 기본 컨셉: 8. IIFE, Modules, Namespaces (0) | 2020.05.21 |
---|---|
javascript 33가지 기본 컨셉: 7. Expression vs. Statement (0) | 2020.05.19 |
javascript 33가지 기본 컨셉: 5. Type of (0) | 2020.05.14 |
javascript 33가지 기본 컨셉: 4. Type Conversion (0) | 2019.03.26 |
javascript 33가지 기본 컨셉: 3. Value and Reference (0) | 2019.03.18 |