반응형
SMALL
14. 전역변수의 문제점
전역변수의 문제점
전역변수 | 지역변수 | |
실행 | 명시적 호출없이 실행 | 함수가 실행되야 생김 |
스코프 | 전역 스코프 | 렉시컬 스코프(함수) |
생명주기 | 전역 객체의 생명주기와 일치 | 렉시컬 스코프가 없어질 때 까지 생존 |
문제점 | 암묵적 결합(모든 코드가 전역변수 참조 및 변경가능) 긴생명주기(따라서 메모리 리소스도 오래 소비) 스코프 체인 상 종점에 존재(전역변수의 검색 속도가 가장 느림) 네임스페이스 오염(변수 이름 충돌) |
스코프는 항상 좁은게 낫다따라서 전역변수보다 권장된다. |
전역변수를 억제하는법
- 즉시실행함수: 모든 코드를 괄호로 감싸면 ⇒ 모든 변수는 즉시실행함수의 지역변수가 됨
- 네임스페이스 객체
var MYAPP = { name: "KIM" }
- ES6 module
- ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공
- var 키워드로 선언한 변수는 더이상 전역변수도 아니고, window도 아님
// type="module" 속성값을 추가하면 // 자바스크립트 파일은 모듈로 동작함 <script type="module" src="lib.mjs"></script>
- ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공
15. let, const 키워드와 블록 레벨 스코프
var 키워드로 선언한 변수의 문제점
- 중복선언가능
var x = 1;
var y = 1;
// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용
// 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작
var x = 100
// 초기화 문이 없는 변수 선언문은 무시됨
var y
console.log(x) // 100
console.log(y) // 1
- 함수레벨 스코프
오직 함수 스코프만 지역스코프로 인정
블록스코프는 무시
var i = 10;
// for문에서 선언한 i는 전역 변수다.
// 이미 선언된 전역변수가 i가 있으므로 중복선언됨
for (var i = 0; i <5; i++) {
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
- 변수 호이스팅
// 에러는 발생안됨
console.log(foo) // undefined
// 변수에 값을 할당(3. 할당 단계)
foo = 123;
console.log(foo); // 123
// 변수 선언은 런타임 이전에 자바스크립트 엔진에 의해 암묵적 실행됨
var foo;
반응형
LIST
'JavaScript' 카테고리의 다른 글
함수 뒤에 나온 변수를 사용하면 왜 에러가 안날까? (0) | 2023.03.28 |
---|---|
원시값을 변수에 할당할 때 어떤 현상이 일어나는가? (0) | 2023.03.28 |
모던 자바스크립트 - 9(타입 변환, 단축 평가), 10(객체 리터럴), 11(원시값과 객체 비교) (0) | 2023.03.15 |
for loop과 forEach 중에 어떤 것이 더 퍼포먼스가 좋을까? (0) | 2023.03.14 |
자바스크립트에서 var로 선언하면 자동으로 전역객체 window로 등록되니? (0) | 2023.03.09 |