JavaScript

[13장, 14장] 스코프 , 전역변수의 문제점

잼굴 2022. 2. 25. 01:47

김치~  v

 

모든 식별자는 자신이 선언된 위치에의해 다른코드가 식별자 자신을 참조할 수 있는 유효범위가 결정된다. -> 스코프

 

스코프: 식별자가 유효한 범위

 

 

함수의 매개변수는 함수몸체 내부에서만 참조할수있고 함수 몸체외부에서는 참조할수 없음.

 

식별자 결정: 이름이 같은 두개의 변수중에서 어떤 변수를 참조해야 할것인지를 결정하는것

 

식별자는 유일해야함. 하나의값은 유일한 식별자에 연결되어야함.

 

 

스코프의 종류:

1. 전역스코프 : 코드의 가장 바깥 영역, (대장)    // 변수는 전역변수

2. 지역스코프 : 함수 몸체 내부                   // 변수는 지역변수

 

전역변수는 어디서든 참조가능함.

지역변수는 자신의 지역과 하위 지역스코프에서 유효함.

 

var x = 'global';
function foo () {
    var x = 'local';
    console.log(x);   // local
}

foo();
console.log(x);     // global
 
 

 

스코프는 피라미드식임 

 

전역스코프 (최상위)

      ↑

Outer  스코프

      ↑

Inner 스코프

 

변수검색할때 저 밑에서 위로 검색함. (최하층 지역변수에 없으면 윗단계에서 검색하고 검색하고 느낌)

 

상위스코프에서 유효한변수는 하위스코프에서 참조가능

But, 하위 스코프에서 상위스코프를 참조할수는 없음.

 

 

함수에의해서만 지역 스코프가 생성됨.

But, var키워드로 선언된 변수는 오로지 함수의 코드블록만을 지역스코프로 인정함.

 

var키워드로 선언된 변수는 블록레벨 스코프를 인정하지 않음.

 

 

동적스코프: 함수를 어디서 호출했는지에 따라 함수의 상위 스코프 결정.

정적 스코프: 함수를 어디서 정의했는지에 따라 함수의 상위 스코프 결정

 

자바 스크립트는 정적스코프임.

따라서 어디서 정의했는지에 따라 상위 스코프를 결정함.

 

 

 

 


 

 

전역 변수의 문제점

 

전역변수의 생명주기 = 애플리케이션의 생명주기

지역변수의 생명주기 = 함수의생성~ 함수의 종료

 

변수선언 = 런타임 이전 단계에서 JS엔진에 의해 먼저 실행됨 // 전역변수에 한정

 

변수의 생명주기 : 메모리 공간이 확보된 시점부터 메모리 고악ㄴ이 해제되어 가용메모리 풀에 반환되는 시점까지

 

 

var x = 'global';

function foo() {
    console.log(x);  //undefined
    var x = 'local';
}

foo()
console.log(x); // global

 

변수할당문이 실행되기 이전까지는 undefined

 

-> 호이스팅은 스코프 단위로 동작함.

 

 

전역변수의 생명주기 = 전역객체의 생명주기

전역객체 : 코드가 실행되기전 JS엔진에 의해 어떤 객쳋보다도 먼저 생성되는 특수객체

변수생성은 할당전에 엔진이 미리해둠

 

 

전역변수의 문제점

 

변수의 유효범위는 커질수록 코드가독성은 나빠짐.

 

전역변수 특

1. 전역변수는 생명주기가 김. 그래서 메모리 리소스도 오래 소비함.

2. var키워드는 변수 중복선언을 허용해서 변수 이름이 중복될 가능성이 있음.

3. 스코프 체인에의해서 전역변수의 검색속도가 가장느림.

4. 동일한 이름의 전역함수랑 겹치는 경우가 생길수있음;

 

전역변수 해결법

 

1. 모든 함수를 즉시실행함수로 만들기.

2. 네임스페이스 객체쓰기. 

3. 모듈패턴 / 클로저기능을 통해 전역변수 억제가능.

 

 

???

ES6 에서는 전역변수 사용 불가?!??

ㅇㅅㅇ;;

'JavaScript' 카테고리의 다른 글

[16장] 프로퍼티 어트리뷰트  (0) 2022.03.08
[15장] let,const, 블록 레벨 스코프  (0) 2022.02.25
[12장] 함수  (2) 2022.02.24
[10장] 객체 리터럴  (0) 2022.02.17
[8장, 9장] 제어문 , 타입변환과 단축평가  (0) 2022.02.17