[JS] 스코프 Scope

728x90
반응형

스코프는 변수에 접근할 수 있는 범위 이다. 

자바스크립트는 기본적으로 ES5까지는 함수 단위 스코프를 지원했고 ES6에 와서 블록 단위 스코프를 지원한다. 

var가 함수 단위의 스코프를 지원하고 let, const가 블록 단위 스코프를 지원한다.

 

 

var, 함수 단위 스코프 

if 나 for 문 같은 블록의 변수는 공유되나 함수 스코프 내의 변수는 공유하지 않는다. 

var a=1; // 전역 스코프 
// if, for와 같은 블록은 같은 스코프라고 인식해서 블록을 지나도 해당 변수에
// 접근할 수 있다.
if(true){
	var a=2;
}

// 함수 내에서 선언된 변수는 함수 스코프를 지원하므로 함수 밖에서는 해당 변수에 
// 접근할 수 없다.
function test(){
  var b=3; 
  console.log(b);
}
test(); //3

console.log(a); //2
console.log(b);// "ReferenceError: b is not defined

위처럼 if문이나 for문에서 선언된 변수는 전역 스코프에서 접근할 수 있지만 

test 함수 내의 변수는 전역 스코프에서 접근할 수 없다. 

var는 함수 단위 스코프를 가지기 때문에 블록은 무시하고 같은 스코프라고 인식한다.

 

if(true){
let a=2;
}

function test(){
  let b=3;
  console.log(b);
}
test(); //3

console.log(a); //"ReferenceError: a is not defined
console.log(b); //"ReferenceError: b is not defined

let의 경우 b 뿐만 아니라 a의 변수에도 접근할 수 없다. 

let 변수의 경우 블록 단위 스코프를 지원하기 때문에 블록을 벗어나는 순간 다른 스코프가 되기 때문이다. 

 

스코프 체인 

 

자신의 스코프에 해당 변수가 없을 경우 스코프 체인을 통해 상위 스코프로 이동하며 변수를 찾는다.

var a=1; // 전역 스코프 

function test(){
  console.log(a);
}
test(); //1

 

 test 함수 스코프 내에서 a 변수가 없으니 스코프 체인을 통해서 전역 스코프로 이동하였다. 

전역 스코프에서 a란 변수를 찾아 그를 출력한다. 

 

 

사담: 스코프와 스코프 체인은 내용이 많아 상세한 부분은 다시 공부하고 추가하려고 한다.

728x90
반응형
TAGS.

Comments