변수 선언, 전역, 지역, 재할당 등 이해
var, let, const의 차이 및 사용법 이해
변수 선언시 사용하는 키워드 → var, let, const
var의 단점
- 블록레벨스코프를 지원하지 않고 함수레벨스코프를 지원한다.
→ 의도치 않게 전역변수가 선언되어 심각한 부작용이 발생하기도 한다.
ES6(♨)에서 새로 도입된 let, const는 var의 여러 단점을 보완하기 위해 나옴
var score; ( 라고 입력시 → '변수 선언'에 의해 확보된 메모리공간은 비어있을 것으로 생각할 수 있으나 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined 라는 값이 암묵적으로 할당되어 초기화된다.
undefined 는 자바스크립트에서 제공하는 원시타입의 값이다.
+자바스크립트의 데이터타입 - 2종류
1. 원시타입 : 숫자, 문자열, 불리언, undefind, null, symbol
*템플릿리터럴♨ : 백틱 (``) 사용해 표현하는것
*null 타입 : 변수에 값이 없음을 의도적으로 명시 . 이전 참조를 의도적으로 제거
2. 객체타입 : 객체, 함수, 배열 등
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. (타입추론)
재할당에 의해 언제든 변수의 타입이 변할 수 있음 (=동적 타이핑)
+변수선언 과정
선언단계 : 변수 이름을 등록해서 자바스크립트 엔진에게 변수의 존재를 알림
초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 를 할당해 초기화.
초기화란 일반적으로 변수가 선언된 이후 최초로 값을 할당하는 것
초기화를 거치지 않으면 확보된 메모리 공간에 이전의 다른 애플리케이션이 사용했던 값 (=쓰레기값)이 남아있을 수 있으므로 암묵적으로 자바스크립트에서 초기화를 수행
선언하지 않은 식별자에 접근시 ReferenceError (참조에러) 발생
자바스크립트는 인터프리터에 의해 한줄씩 순차적으로 실행되므로 변수선언 전에 실행시킨 함수에서 변수가 제대로 불러와지는 현상을 호이스팅이라고 한다. 이것이 발생하는 이유는 변수선언이 소스코드가 한줄씩 실행되는 시점 (런타임) 이 아니라 이전단계에서 먼저 실행되기 때문이다.
소스코드평가(선언문 등 실행) → 소스코드 실행(런타임)
변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라 한다.
호이스팅 되는 모든것 : var, let, const, function, class … 모든 선언문은 런타임 이전에서 실행되는 것을 잊지말자!
변수선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다!
+스코프란?
식별자의 유효범위, 함수 본체 내부
var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언이 허용된다. 의도치 않게 변수값이 재할당되어 변경되는 부작용을 발생시킬 수 있다.
하지만 let이나 const 는 같은 스코프 내에서 중복 선언을 허용하지 않는다.(SyntaxError : Identifier ‘x’ has alreay bennd declared.)
전역 - 코드의 가장 바깥쪽 영역
지역 - 함수 몸체 내부
함수 내부에서 선언된 x변수 이외에 전역에 x 가 존재시, 자바스크립트엔진이 스코프체인을 통해 참조할 변수를 검색하여 함수 내부의 선언된 x 변수를 참조한다. → 코드의 문맥은 렉시컬환경으로 이뤄진다. (코드의 문맥을 고려한다는 것이 이건가? 실행컨텍스트에서 평가, 실행. 23장에서 추가)
외부함수의 지역 스코프를 중첩 함수의 상위스코프라 한다. 최상위는 전역스코프
자바스크립트 엔진이 변수 참조시 스코프체인을 통해 변수를 참조하는 코드의 스코프에서 상위 스코프 방향으로 이동하며 선언된 변수를 검색
함수는 중첩될 수 있으므로 지역 스코프도 중첩된다. = 스코프가 함수에 의해 계층 구조를 갖는다
→ 계층적으로 연결된 것을 스코프체인 이라 한다.
이와 같은 유사한 자료 구조 ‘렉시컬환경’ 을 생성. key-value로 이루어진 자료구조
*함수레벨스코프
지역은 함수 몸체 내부이며 지역스코프를 만든다. = 코드블록이 아닌 함수에 의해서만 지역스코프가 생성된다. var는 오로지 함수의 코드블록만을 지역스코프로 인정하기 때문에 의도치 않게 중복선언되어 변수값이 변경되는 부작용이 생길 수 있다.
*블록스코프
c나 자바.. 등 대부분의프로그래밍 언어는 함수 몸체만이 아니라 모든 코드블록 (if, for, while, try/catch) 이 지역스코프를 만든다
자바스크립트와 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다.
함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정.
함수를 어디서 호출했는지가 아닌 함수를 어디서 정의 했는가에 따라 상위 스코프를 결정한다.
함수가 호출된 위치는 사우이 스코프 결정에 어떠한 영향도 주지 않는다.
함수의 상위 스코프는 언제나 자신이 정의된 스코프다.
함수 객체는 자신이 정의된 스코프를 기억한다. 호출되면 어디인지 상관없이 자신이 기억하는 전역 스코프를 상위 스코프로 사용한다 +클로저
밑으로 갈수록 내가 이해하고 있는게 맞는지 의심된다 ........🤔 이제 뭐 거의 상상의...
'javascript' 카테고리의 다른 글
| 변수 선언, 전역, 지역, 재할당 등 이해 var, let, const의 차이 및 사용법 이해 (2) (1) | 2023.12.29 |
|---|