본문 바로가기
JavaScript

[JavaScript] 스코프(Scope)

by eddypark 2023. 10. 16.

(1) 스코프(유효범위)란

- 참조 대상 식별자를 찾아내기 위한 규칙이다.

- 전역 스코프와 지역 스코프로 나뉜다.

- 전역 스코프(어디서든지 참조 가능) → 전역 변수(전역에 선언된 변수)

- 지역 스코프(함수 코드 블록, 함수 자신, 하위 함수에서만 참조 가능) → 지역 변수(함수 내에서 선언된 변수)

var a = 'wangi';    // 전역변수
 
function x() {
  var b = 'eddy';   // 지역변수
  console.log(a);   // 'wangi'
  console.log(b);   // 'eddy'
}
x();
 
console.log(a);     // 'wangi'
console.log(b);     // error b는 지역변수

(2) 상위 스코프를 결정하는 방법

- 동적 스코프와 렉시컬 스코프 두 가지가 있다.

- 동적 스코프(Dynamic Scope)는 함수를 어디서 호출 하였는지에 따라 상위 스코프를 결정한다.

- 렉시컬 스코프(Lexical Scope)는 함수를 어디서 선언 하였는지에 따라 상위 스코프를 결정한다.

- javascript에선 렉시컬 스코프를 따르므로 선언한 시점에 상위 스코프가 결정된다.

var x = 1;

function a() {        
  var x = 10;
  b();
}

function b() {     // 상위 스코프는 전역 스코프
  console.log(x);
}

a();               // 1
b();               // 1

(3) 암묵적 전역과 비블록 레벨 스코프

- javascript는 블록 레벨 스코프를 사용하지 않는다.

- 비 블록 레벨 스코프는 함수 밖에서 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 전역 스코프를 갖게 된다.

if (true) {
  var x = 5;
}
console.log(x); // 5 x는 전역변수

- 암묵적 전역 변수는 선언하지 않은 변수를 전역 변수로 취급하는 것을 말한다. (호이스팅 불가, delete로 삭제 가능)

console.log(x);            // undefined 전역변수 x는 호이스팅이 발생한다.
console.log(y);            // Error y는 전역변수가 아니라 호이스팅이 발생하지 않는다.
 
var x = 10;                // 전역 변수

function foo () {
  y = 20;                  // 선언하지 않은 식별자
  console.log(x + y);
}

foo();                     // 30
console.log(x);            // 10
console.log(y);            // 20
 
delete x;                  // 전역변수는 삭제되지 않는다.
delete y;                  // 프로퍼티는 삭제된다.
console.log(x);            // 10
console.log(y);            // error

'JavaScript' 카테고리의 다른 글

[JavaScript] this  (1) 2023.10.17
[JavaScript] Strict mode  (0) 2023.10.16
[JavaScript] 프로토타입  (0) 2023.10.13
[JavaScript] 함수  (1) 2023.10.12
[JavaScript] 객체 변경 불가성  (1) 2023.10.11