HTML 파싱 -> 렌더 트리 구축 -> 렌더 트리 배치 -> 렌더 트리 그리기
① 렌더링 엔진은 HTML 문서를 파싱하여 DOM 트리를 구성합니다.
② 그 다음 외부 CSS 파일과 함께 포함된 스타일 요소인 CSSOM을 파싱합니다.
③ DOM 트리와 ②의 결과물을 합쳐 렌더 트리를 구축합니다.
④ 렌더 트리 각 노드에 대해 화면 상에서 배치할 곳을 결정합니다.
⑤ UI 백엔드에서 렌더 트리의 각 노드를 그립니다.
그렇다면 JS는?
자바스크립트는 자바스크립트 엔진이 처리합니다. HTML 파서는 script 태그를 만나면 DOM 생성 프로세스를 중지하고 자바 스크립트 엔진으로 권한을 넘깁니다. 즉 동기적으로 처리합니다. (JavaScript 코드를 body 하단에 위치시키는 이유)
사용자가 브라우저에 검색하고자 하는 URL을 입력하면 브라우저가 DNS 서버에 도메인을 검색하여 IP주소를 전달해줍니다. IP주소를 통해 HTTP 요청 메세지를 해당 웹 서버에 요청하고 데이터를 전송받는데 그것을 렌더링 엔진에서 처리합니다. HTML 문서를 파싱하여 DOM 트리를 구성하고 CSS 파일을 통해 CSSOM을 파싱한 뒤 둘을 합쳐 렌더 트리를 구축합니다. 이후 렌더 트리를 배치할 곳을 정해주고 렌더 트리의 각 노드를 그립니다.
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말합니다.
var 변수 선언과 함수 선언문에서 호이스팅이 일어납니다. let과 const에서도 호이스팅은 발생하지만 TDZ의 제약을 통해 오류가 발생합니다.
호이스팅은 장점때문에 사용되는 것이 아니고 호이스팅때문에 발생하는 에러를 피하기 위해 알아둬야한다에 가깝습니다. 이러한 개념을 모르고 var을 남발하고 값을 확인하면 원인을 알 수 없는 undefined나 원하지 않는 변수가 저장된 상황을 만날 수 있기 때문입니다. ES6가 적용된 이후에는 let과 const를 통해 이러한 에러를 조기에 차단할 수 있습니다.
Scope는 유효범위라는 뜻으로 변수와 매개변수의 접근성과 생존기간을 뜻합니다.
전역 스코프와 지역 스코프로 나눌 수 있는데, JS는 다음과 같은 특징을 가집니다.
JS는 유효범위 단위가 블록이 아닌 함수 단위로 if, for문과 같은 구문들이 사용되었을 때 중괄호 밖의 범위에서도 사용이 가능하다.
JS는 다른 프로그래밍 언어와 달리 변수명이 중복되어도 에러나지 않고 가장 가까운 범위의 변수를 참조합니다. (var의 경우)
JS는 var 변수를 생략할 경우 전역 변수로 자동 선언됩니다.
내부 함수가 정의될 때 외부 함수의 환경을 기억하고 있는 내부 함수를 말합니다. 외부 함수 안에서 선언된 내부 함수는 그 외부 함수의 지역 변수가 함수에 접근하여 사용할 수 있습니다.
클로저는 다음과 같은 이유로 사용할 수 있습니다.
상태 유지 : 현재 상태를 기억하고 변경된 최신 상태를 유지할 수 있다.
전역 변수의 사용 억제 : 상태 변경이나 가변 데이터를 피하고 오류를 피하는 안정성을 증가시킬 수 있다.
정보의 은닉 : 클래스 기반 언어의 private 키워드를 흉내낼 수 있다.
margin은 Object의 외부여백을 말하고 padding은 Object의 내부여백을 의미합니다.
Position은 태그들의 위치를 결정하는 CSS입니다. static, relative, absolute, fixed
relative를 사용하고 top, left와 같은 것들을 사용하면 부모요소 기준으로 top, left로 움직일 수 있고
absolute는 부모요소가 아닌 특정 요소를 기준으로 한 위치를 정할 수 있다.
특정 기준은 position이 relative, fixed, absolue 선언된 곳
fixed는 스크롤과 같은 상황에도 항상 같은 위치를 유지하는 것
GET은 서버에서 어떤 데이터를 가져와서 보여주고 POST는 서버상의 데이터 값이나 상태를 바꾸기 위해 사용
JS의 this 키워드는 JAVA의 this의 개념과 달라 혼란을 줍니다. JAVA에서는 this가 객체 자신에 대한 참조 값을 가지고 있다는 뜻이지만 JS의 경우 해당 함수 호출 방식에 따라 this에 바인딩 되는 객체가 달라집니다.
this의 4가지 동작 방식
전역 스코프에서 정의한 변수들은 전역 객체에 등록됩니다. 즉 this를 하면 window가 된다.
어떤 객체를 통해 함수가 호출된다면 그 객체가 바로 this의 context 객체가 된다.
function test() {
console.log(this.a);
}
var obj = {
a: 20,
func1: test,
func2: function() {
console.log(this.a);
}
};
obj.func1(); // 20
obj.func2(); // 20
call, apply, bind 메소드를 가지고 있는데 첫번째 인자로 넘겨주는 것이 this context가 됩니다.
function test() {
console.log(this);
}
var obj = { name: "yuddomack" };
test.call(obj); // { name: 'yuddomack' }
test.call("원시 네이티브 자료들은 wrapping 됩니다"); // [String: '원시 네이티브 자료들은 wrapping 됩니다']
function foo(a) {
this.a = a;
this.qwer = 20;
}
var bar1 = new foo(2);
console.log(bar1.a); // 2
console.log(bar1.qwer); // 20
// 1. 새 객체가 만들어짐
var obj = {};
// 2. 새로 생성된 객체의 Prototype 체인이 함수의 프로토타입과 연결됨
Object.setPrototypeOf(obj, foo.prototype); // 프로토타입을 연결합니다. 이 글에서는 무시해도 상관없습니다.
// 3. 1에서 생성된 객체를 context 객체로 사용(명시적으로)하여 함수가 실행됨
foo.call(obj, 2);
// 4. 이 함수가 객체를 반환하지 않는 한 1에서 생성된 객체가 반환됨
var bar2 = obj; // 여기서 foo는 반환(return)이 없으므로 인스턴스가 생성(된 것처럼 동작)
console.log(bar2.a); // 2
console.log(bar2.qwer); // 20
저장한 데이터를 명시적으로 지우지 않는 이상 영구적으로 보관이 가능하다.
브라우저가 종료되면 데이터도 같이 지워진다.
HTTP URL을 통해 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD를 적용하는 것을 의미합니다
HTTP 프로토콜의 표준을 최대한 활용하고 HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능합니다.
하지만 사용할 수 있는 메소드가 4개로 제한적이고 구형 브라우저에서 호환이 되지 않는 경우가 있다.
JavaScript 에서는 동시성을 지원하는 이벤트 루프가 있기 때문에 비동기적 설계를 할 수 있다.
실행되는 함수를 싱글 스레드 형식으로 처리하는 콜 스택이 있고 콜 스택이 비었을 때마다 '콜백 큐'에서 대기 중이 함수를 콜 스택으로 불러와 실행시킵니다.
이벤트 루프에서는 이벤트 발생 시 호출되는 콜백 함수들을 콜백 큐에 전달하고 콜백 큐에 담겨있는 콜백 함수들을 콜 스택으로 넘겨줍니다.
이벤트 버블링은 특정 화면 요소에서 이벤트가 발생했을 때, 해당 이벤트가 더 상위의 화면 요소들로 전달되어가는 특성을 의미합니다.
이벤트 버블링은 이벤트 위임의 동작 메커니즘이라고 볼 수 있습니다.
반대로 구현하는 것을 이벤트 캡쳐라고 합니다.
addEventListener의 옵션 객체에 capture : true를 설정하면 됩니다.
stopPropagation(); 웹 API를 사용하여 이벤트의 전파를 막을 수 있습니다.
이벤트가 발생한 요소는 상위의 요소들로 이벤트가 위임되는 특성을 활용해 TO-DO 리스트와 같이 체크박스가 일일히 추가되어야 하는 기능에서 체크박스의 상위 요소에 이벤트를 처리하게 함으로써 코드량을 줄이고 유지보수 및 공수를 크게 절약할 수 있습니다.
타입스크립트는 기존의 자바스크립트에 정적 타입을 추가해 코드량이 많아지는 거대한 프로젝트에서 유지보수성을 크게 높일 수 있습니다.
실제 사용했을 때 느낄 수 있었던 가장 큰 장점은 타입이 지정되어 있기 때문에 기존 JS에 비해 IDE를 통한 함수 별 인수들을 한 눈에 확인할 수 있다는 점이 가장 큰 것 같습니다.