TypeScript를 사용하다 보면 함수 타입 할당에서 예상과 다른 결과를 마주할 때가 있다.특히 "더 구체적인 타입을 받는 함수를 더 일반적인 타입을 받는 함수에 할당할 수 없다"는 규칙은 처음에는 직관적이지 않게 느껴질 수 있다. 이는 TypeScript의 반공변성(Contravariance)이라는 개념 때문인데,어려운 용어는 잠시 제쳐두고 음식과 요리사 예시를 통해 이 개념을 이해해보자.기본 타입 관계부터 살펴보기먼저 간단한 타입 관계를 정의해보겠다:type Food = 'pizza' | 'burger' | 'salad'type Pizza = 'pizza'여기서 Pizza는 Food의 부분집합이다. 따라서 다음과 같은 할당이 가능하다:const a: Food = 'pizza' // ✅ OK - ..
front-end/javascript
렉시컬 환경을 설명하며 호이스팅에 간단하게 언급했었다. (https://bysxx.tistory.com/3) 렉시컬 환경을 간단하게 요약하자면 자바스크립트를 실행하며 코드 실행에 필요한 정보가 함수 단위로 쌓이는 객체를 실행 컨텍스트라고 하고 여기에는 렉시컬 환경이 있는데 여기에는 함수 내부의 정보를 가진 environmentRecord, 함수 외부의 정보를 가진 outer-EnvironmentReference가 있다. 여기서 environmentRecord
만약 누군가에게 자바스크립트에 대해 한 가지만 알려줄 수 있다면 실행 컨텍스트에 대해 알려줄 것 같다. 그만큼 실행 컨텍스트는 가장 중요한 자바스크립트의 핵심 원리이자 여러 가지 특이한 특징들을 가지는 이유가 된다. 먼저 실행 컨텍스트를 한 줄로 요약해 보자면 자바스크립트가 실행됐을 때 스택형태로 쌓이는 하나의 객체이다. 이것만 들어서는 이해하기 힘들 것 같으니 사진과 함께 설명하자면 function foo() { function bar() { console.log('bar') } bar() } foo() 위 코드를 실행했을 때 아래 사진처럼 진행되게 된다 1. 먼저 전역 실행컨텍스트가 쌓이게 되고 2. 그 이후 foo가 실행되며 스택에 쌓임 3. foo안에 있는 bar가 실행되고 스택에 쌓임 4. ba..