SONG's 개발새발

Javascript Scope

2019-04-22

스코프 Scope

Scope : 변수에 접근할수 있는 범위 (변수의 유효범위)


1. 전역스코프, 지역스코프

  1. Global Scope ( 전역변수 , 전역함수 )
  • 함수 밖에서 선언된 변수
  • 자바스크립트 어디에서나 사용 가능
  1. Local Scope ( 지역변수 , 지역함수 )
  • 함수 안에서 선언된 변수
  • 함수 코드 블록이 만든 스코프 영역에서만 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function outerFunction() {
var inner = "var"; // 지역 변수

function innerFuction() {
// 지역 함수
코드;
}
}
// outerFunction 함수 안에서 선언된 변수
// 함수 : 지역변수, 지역함수

outerFunction();
// outerFunction이 호출됨으로써 스코프 안의 지역 변수, 함수도 호출됨!

innerFunction();
// 스코프 안의 지역변수, 지역함수는 그 안에서만 존재!!!
// innerFunction을 호출하지 못함
  • 블록 유효 범위 : let, const (ES6) -> 지역 변수
    • 중괄호 안에서만 유효 {}
    • 호이스팅 X
    1. let : 변수 선언
    2. const : 상수 선언

2. 스코프체인

  • 프로토타입 체인과 같은 방식 : 아래에서 위로 찾아 나간다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var value = "global";

function outFunc() {
// 이때의 value는 local영역의 value가 없기 때문에 global 의 value 를 참조합니다.
console.log(value);

function innerFunc() {
// 이때도 마찬가지로 local에 value가 없기 때문에 global 의 value 를 참조합니다.
console.log(value);
// innerValue 라는 지역 변수 선언합니다.
var innerValue = "local";
}
innerFunc();
}
outFunc();
// error: innerValue is not defined
// 외부에서 내부 스코프의 값을 참조할 수 없습니다. global 에서는 innerValue가 선언된 줄도 모르고 있습니다.
console.log(innerValue);
//(3)

function outter() {
console.log(value);
// (2)

function inner() {
console.log(value);
// (1)

var innerValue = "local";
//inner함수 안에서만 참조 가능
}
}

outter();

console.log(innerValue);
// error : 지역변수는 스코프안에 갇혀 있기 때문에 참조 할 수 없다
  1. inner안에 value가 없기 때문에 위의 스코프 단위의 value를 찾는다.
  2. outter안에 value가 없기 때문에 global영역의 value값을 가져오게 된다.
  3. 전역변수 var value = “global” 의 값을 내뱉는다.
console.dir(변수,함수 명)
[[Scope]]에서 글로벌변수나 글로벌함수를 찾을 수 있다.