JavaScript란?
인터프리터 언어
- 소스 코드를 바로! 실행하는
- 개발자가 별도의 컴파일 작업 수행 x
컴파일러 vs 인터프리터
자바스크립트 가상 머신
호환성?
동적 타입 언어
- 코딩할 때 데이터 타입을 직접적으로 선언하지 않는 언어
- js, python
- 값이 '할당'되는 과정에서 자동으로 변수 타입 결정 (js 엔진의 타입 추론)
- = 런타임에 타입 지정
런타임?
재할당 시 타입 달라져도 오류 안나는 이유
데이터 타입
cf) 정적 타입 언어 : c, java, typescript. 변수에 저장할 값의 종류를 사전에 타입 지정
일급 객체 (함수)
- 프로그래밍 언어의 기본적 조작을 제한없이 사용할 수 있는 대상
이거 꽤나 어렵네
아니네 좀 많이 어렵네 ㅎ ㅠ
- 일급 객체의 조건
- 무명의 리터럴(값)로 표현이 가능하다.
- 변수나 자료 구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 반환값으로 사용할 수 있다.
js는 위 조건 모두 만족. 따라서 일급객체
= js의 함수 ~= 변수처럼 사용 가능 => 콜백함수, 고차함수, 클로저 등의 형태가 가능
변수
선언 but 값 할당 안할시 -> undefined
선언도 안한 변수 -> ReferenceError 발생
js의 스코프
전역 스코프 vs 지역 스코프
변수의 스코프 : 선언 위치에 의해 스코프 가지게됨 -> 전역변수 vs 지역변수
js는 함수레벨 스코프를 따른다
ㅎ 어렵당ㅎ
함수레벨 스코프란, '함수 내에서 선언된 변수는 함수내에서만 유효'
함수 내 지역 영역에서는 전역과 지역 변수 모두 참조 가능. but 변수명이 중복된 경우, 지역변수를 우선하여 참조.
즉. 함수 내에 있는 애는 지역변수, 나머지는 싹다 전역변수
=> var 범위가 함수레벨스코프임. => 그로 인한 문제점 존재 -> let, const
블록레벨 스코프란
코드 블록 (함수, if문, for문, while문, try/catch문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.
즉. 블록 내에 있는 애는 지역변수, 나머지는 싹다 전역변수
결론 : 자바스크립트는 기본적으로 함수 레벨 스코프를 따른다. 그러나 ES6에서 도입된 let, const를 통해 블록 레벨 스코프를 사용할 수 있다.
스코프 체인
스코프가 계층적으로 연결되어 있는것
변수 참조 시 js엔진이 변수를 참조하는 코드의 스코프에서 시작해서, 상위 스코프 방향으로 이동하면서 선언된 변수를 검색
렉시컬 스코프 lexical scope == 정적 스코프
와웅 어려움
정적 스코프 vs 동적 스코프
js 등 대부분의 프로그래밍 언어는 렉시컬!
함수를 어디서 호출했는지가 아닌, 어디에 선언했는지에 따라 상위스코프 결정
변수 생성 단계
1. 선언단계
2. 초기화단계
3. 할당단계
선언단계: 변수객체에 변수 등록. 이 객체를 스콮프가 참조하는것. (var vs let vs const)
초기화단계: 변수객체에 등록된 변수를 메모리에 할당. 이 단계에서 변수는 undefined로 초기화
할당: undefined로 초기화된 변수에 실제값 할당
var -> 호이스팅.
미리 엔진이 싹 돌아서 선언하기 때문에, undefined 로 출력됨.
반면, let은 referenceError 발생
호이스팅
인터프리터가 코드를 실행하기 전에 모든 선언문 (함수, 변수, 클래스 또는 임포트(import) )이 해당 Scope의 선두로 옮겨진 것처럼 동작하는 특성
-> var 변수 선언 및 함수 선언에서 일어남
let, const 변수 선언에서는 호이스팅 발생하지만, TDZ에 의해 변수에 접근 불가
암묵적 전역
선언하지 않은 식별자에 값 할당ㅇ시, 전역객체의 프로퍼티가 됨
변수a 가 아닌, window.변수a로 해석한다는 의미
https://www.notion.so/dosopt/JavaScript-4d159216966c49d580dbea9637b8368e?pvs=4#c2d0dcf420204631b736227f74b45ae3