전역 변수 사용은 위험하다.
지역 변수를 사용해라.
14.1 변수의 생명 주기
1. 지역 변수 생명 주기
생성 : 변수 선언
할당 : 값을 가짐
소멸 : 생명 주기, 자신이 등록된 스코프가 소멸(메모리 해제)될 때까지 유효
메모리 공간은 누구도 참조하지 않을 때 가비지 콜렉터에 의해 해제되어 가용 메모리 풀에 반환 됨.
지역 변수는 foo 함수가 호출 전까지 생성되지 않는다.
foo(); 호출되어야 지역 변수가 생성된다.
전역변수에 적용되는 것: 호이스팅
런타임 이전 단계, 자바스크립트 엔진에 의해서 변수 선언은 먼저 실행된다.
호이스팅: 스코프 단위로 동작한다.
2. 전역 변수 생명 주기
전역 코드 <---> 함수
명시적 호출이 없어도 실행됨.
더 이상 실행할 문이 없을 때 종료.
var 키워드로 선언한 전역 변수
전역 객체의 프로퍼티
: 자바스크립트 엔진에 의해 제일 먼저 생성 되는 특수한 객체
브라우저: window, self
node.js : global 객체
환경에 따라 전역 객체를 가리키는 다양한 식별자에서 globalThis로 통일 됨
환경에 따라 다르다.. 모든 브라우저마다 다르니까~~
환경과 무관.
자바스크립트란? 언어 : 웹브라우저에서. 여러 요소를 동적으로 움직이거나, 외부와 통신하기 위해. 사용하는 언어.
nodeJS 란? 웹브라우저에서 벗어나. 자바스크립트를 실행시켜주는. 또 다른 자바스크립트 실행 환경
1. 서버에서 사용하는 프로그램을 만들 수 있다.
서버: 웹브라우저, 모바일 앱 요청 --> 응답을 해주는 컴퓨터
globalThis 는 객체이다.
3.4부터 사용 가능
참고: https://youtu.be/PB88qStKpgM
window 객체의 프로퍼티다
window를 닫을 때까지 유효하다.
14.2 전역 변수 문제점
암묵적 결합
모든 코드가 전역 변수를 참조하고, 변경할 수 있다!
변수의 유효범위가 클수록 코드의 가독성은 나빠진다.
긴 생명 주기
전역 변수는 생명 주기와 같다
var 중복 선언을 허용. 변수 이름 중복 가능성 있다.
원치 않은 재할당이 생김
속도가 느리다
젼역 변수의 검색 속도가 느리다.
포든 스코프 체인 상에 마지막에 존재 함.
가장 마지막에 검색된다.
네임스페이스 오염
파일이 분리되어 있어도 전역 스코프를 공유한다.
파일 내에 동일한 이름으로 전역 변수, 전역 함수가 재할당 되면 꼬여버린다.
14.3 전역 변수의 사용을 억제하는 방법
전역 변수 ------> 지역 변수 바꿔버려
스코프 넓다 << 스코프 좁을수록 좋다
1. 즉시 실행 함수
한번만 호출된다
모든 코드를 즉시 실행 함수로 바꾼다? --> 모든 변수는 즉시 실행 함수의 지역 변수가 됨
2. 네임스페이스 객체
전역에 네임스페이스 역할을 담당할 객체를 생성
전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가
3. 모듈 패턴
클래스 모방
관련 있는 변수, 함수를 모아
즉시 실행 함수로 감싸 하나의 모듈로 만든다.
전역 변수 억제, 캡슐화 구현
캡슐화:
객체의 상태: 프로퍼티 : 프로퍼티 값
동작: 메서드1
메서드2
메서드를 하나로 묶는 것.
캡슐화: 프로퍼티, 메서드를 감출 수 있다. (정보 은닉 informaiton hiding)
자바에서는 public, private, protected 처럼 접근제한자가 있으
자바스크립트에는 접근제한자 없음. 그래서 모듈패턴으로 한다.
4. ES6 모듈
전역 변수 사용할 수 없다.
모듈 내에서 var 는 더는 전역 변수가 아니다.
window 객체의 프로퍼티도 아니다.
<script type="module" src="lib.mjs"> </script>
script 태그에
type="module"을 어트리뷰트를 추가하면
로드된 자바스크립트 파일 lib.mjs 이
모듈로서 동작한다.
'자바스크립트-스터디[2021-10-05~완료]' 카테고리의 다른 글
[4주차] 15장 let, const 키워드와 블록 레벨 스코프 (0) | 2021.10.27 |
---|---|
13 스코프 (0) | 2021.10.19 |
13 렉시컬 스코프 (0) | 2021.10.16 |
12 함수 (0) | 2021.10.15 |
9장 타입 변환과 단축 평가 (0) | 2021.10.12 |