JavaScript/You Don't know JS

호이스팅 정의 : 변수와 함수 선언문을 선언된 위치에서 코드의 꼭대기로 올리는 동작 호이스팅을 동작을 한번 코드를 보며 확인해보자. a = 2; var a; console.log(a); 위의 코드에서 var a 라는 변수 선언문이 있다. JS엔진은 코드를 인터프리팅 하기 전에 컴파일한다.(중요) 컴파일레이션 단계 중 모든 선언문을 찾아 적절한 스코프에 연결해주는 것이 렉시털 스코프의 핵심이다. 고로 위의 코드에서는 아래와 같은 구문으로 나누어진다. var a; a = 2; 첫번째 구문은 선언문으로 컴파일레이션 단계에서 처리되며, 두번째 구문은 대입문으로 실행 단계 까지 방치된다. 고로 코드는 다음과 같이 처리된다. var a; a = 2; console.log(a); 선언문만 끌어올리고 다른 대입문이나 ..
4. 스코프 역활을 하는 블록 JS에서 함수가 가장 보편적이고 널리 퍼진 디자인 접근법 이지만, 다른 스코프 단위도 존재하며 이를 이용하면 더 깔끔한 코드를 작성할 수 있다. 예를 들어 블록 스코프를 보자. JS는 지원하지 않지만 아래의 코드같은 모습은 많이 봤다. for(let i = 0; i < 10; i++){ ... } 변수 i를 for 반복문의 시작부에 선언하는 이유는 i를 오직 for 반복문과 관련해서 사용하려하기 때문이다. 블록 스코프의 목적은 변수를 최대한 사용처 가까이에서 최대한 작은 유효 범위를 갖도록 선언하는 것이다. 위의 코드에서는 그 목적을 제대로 반영하는 것 같다. 4.1. with with은 사용하게 되면 동작 속도가 저하되지만, 블록 스코프의 형태를 보여주는 한 예로 with..
1. 함수 기반 스코프 각각의 선언된 함수는 각자의 버블을 생성하지만 다른 자료 구조도 자체적인 스코프를 생성하지 않나는 것은 사실이 아니다. 함수 스코프는 모든 변수가 함수에 속하고 함수 전체(중첩 스코프 포함)에 걸쳐 사용, 재사용된다. 2. 일반 스코프에 숨기 스코프를 통해 숨는 이유는 여러가지 있지만, 소프트웨어 디자인 원칙인 '최소 권한의 원칙'*('최소 권위', '최소 노출' 으로도 불림)과 관련있다. * : 모듈 / 객체의 API와 같은 소프트웨어를 설계할 때 필요한 것만 최소한으로 남기고 나머지는 숨겨야 한다는 것 모든 변수, 함수가 글로벌 스코프에 존재하면 최소 권위에 반하는 규칙이다. const func1 = (a) => { const func2 = (a) => { return a - ..
렉시컬 스코프란? 개발자가 코드를 작성할 때 함수를 어디에 선언하는지에 따라 정의되는 스코프 컴파일레이션의 렉싱단계에서 모든 확인자가 선언된 위치를 파악해 실행 단계에서 어떤 확인자를 검색할지 예상할 수 있도록 도와준다. const foo = (a) => { var b = a * 2; const bar = (c) => { console.log(a, b, c); } bar(b * 3); } foo(2); // 2, 4, 12 위의 코드에는 3개의 중첩 스코프가 있다. 글로벌 스코프이며, 해당 스코프 안에는 하나의 확인자(foo)만 있다. foo의 스코프이며, 해당 스코프는 3개의 확인자(a, bar, b)가 있다. bar의 스코프이며, 해당 스코프는 하나의 스코프(c)만 있다. 검색 엔진은 스코프 버블의 ..
Javascript는 컴파일러 언어이다. 컴파일러 언어의 처리 과정에서 소스코드 실행 전 3단계를 거친다. 컴파일레이션 1. 토크나이징 / 렉싱 문자열을 나누어 토큰이라는 조각으로 만드는 과정 (빈칸은 의미가 있냐 없냐에 따라 토큰으로 남을 수 있다) 2. 파싱 토큰 배열을 프로그램의 문법 구조를 반영해 중첩원소를 갖는 원소를 갖는 트리 형태로 바꾸는 과정이다. (파실 결과로 만들어지는 것이 AST 추상 구문 트리 이다) 3️⃣. 코드 생성 AST를 컴퓨터에서 실행 코드로 바꾸는 과정이다. JS엔진은 파싱과 코드 생성 과정에서 불필요한 요소를 삭제하는 과정을 거쳐 실행시성능을 최적화한다. JS엔진이 기존 컴파일러와 다른 점은 JS컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 많지는 않다. 어떤 JS..
챕터 4 ) 강제 변환 🔸 값 변환 어떤 값의 타입을 바꾸는 과정이 명시적이면 타입 캐스팅, 암시적이면 강제변환 이라 한다. 타입 캐스팅 : 정적 타입 언어에서 컴파일 시점에 발생하며, 의도적으로 변환 사실이 명확하다. 강제 변환 : 동적 타입 언어에서 런타임 시점에 발생하며, 작업 중 불분명한 부수 효과로 부터 발생한다. 🔸 추상 연산 ToString 1️⃣ 내장 원시값은 문자열화 방법이 정해져 있다.(null ➡ "null", undefined ➡ "undefined", true ➡ "true") 숫자는 그냥 변환 되자만 큰 수는 지수화 되어 저장된다. 2️⃣ 일반 객체는 지정이 없다면 내부 [[Class]] 를 반환한다.("[object Object]") 3️⃣ 배열은 toString()이 있기에 ..
58청춘
'JavaScript/You Don't know JS' 카테고리의 글 목록