일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
Tags
- 프론트엔드스쿨
- 한달후기
- 제로베이스
- 제로베이스 후기
- 목표
- PADDING
- JavaScript
- CSS
- MARGIN
- 프론트엔드vs백엔드
- 웹 개발
- 자바스크립트
- 프론트엔드공부
- 미션회고
- 부트캠프
- html/css
- 프론드엔드스쿨
- 후기
- 개발공부
- 프론트엔드
- Border
- 하차
- 프론트엔드개발자
- 가고 싶은 회사
- HTML
- Frontend
Archives
- Today
- Total
개발자가 되어보자
[Weekly Paper] 4. Javscript 변수 & 브라우저 동작 원리 본문
Javscript 변수
- var
- var 키워드로 선언한 변수는 중복 선언 가능 → 변수명이 같은 변수를 중복해 선언해도 에러 발생 X
- javascript의 특징으로 모든 선언문은 호이스팅 되기 때문
- 호이스팅 : 모든 선언문이 해당 scope의 선두로 옮겨진 것처럼 동작하는 특성. 자바스크립트는 모든 선언문(var, let, const, function, class)이 선언되기 이전에 참조 가능
- 함수 레벨 스코프를 가진다
- 함수 레벨 스코프 : 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수
- 문제점
- 함수 레벨 스코프
- 전역 변수 남발
- for loop 초기화식에서 사용한 변수를 for loop 외부 또는 전역에서 참조할 수 있다
- var 키워드 생략 허용
- 의도하지 않은 변수의 전역화
- 중복 선언 허용
- 의도하지 않은 변수값 변경
- 변수 호이스팅
- 변수를 선언하기 전에 참조가 가능. 변수가 먼저 선언되서 undefined로 초기화되며 선언 전에 참조할 땐 undefined로 초기화되서 나타난다.
- 함수 레벨 스코프
- let
- 블록 레벨 스코프
- 블록 레벨 스코프 : 코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다
- 업데이트는 가능, 재선언은 불가능
- 동일한 변수가 다른 범위 내에서 정의된다면, 에러는 더 이상 발생
- var와 마찬가지로 let 선언은 맨 위로 끌어올려지지만 var와 다르게 초기화 되지 않는다. 선언 이전에 let 변수를 사용하려고 시도하면 Reference Error(참조 오류)가 발생한다.
- 블록 레벨 스코프
- const
- 상수 선언
- 블록 레벨 스코프
- 업데이트, 재선언 불가능
- 선언하는 당시에 초기화 되어야 한다
- let과 마찬가지로 const 선언도 맨 위로 끌어올려지지만 초기화되지는 않는다.
var | let | const | |
종류 | 변수 선언 | 변수 선언 | 상수 선언 |
중복 선언 여부 | O | X | X |
호이스팅 여부 | O | X | X |
스코프 | 함수 레벨 스코프 | 블록 레벨 스코프 | 블록 레벨 스코프 |
재선언 | O | O | X |
브라우저 동작 원리
- 브라우저
- Chrome, Safari, Firefox, internet explorer
- MDN에서는 웹에서 페이지를 찾아서 보여주고, 사용자가 하이퍼링크를 통해 다른 페이지로 이동할 수 있도록 하는 프로그램이라고 정의
- 유저가 선택한 자원을 서버로부터 받아와서 유저에게 보여준다 → 자원은 페이지 외 이미지, 비디오 등의 컨텐츠들도 포함
- 브라우저 렌더링 동작 과정
- HTML 파일과 CSS파일을 파싱해서 각각 트리를 만든다(parsing)
- 가장 먼저 받아온 HTML 파일을 해석
- HTML파일을 해석하여 DOM Tree를 구성하는 단계
- 파싱 중 HTML에 CSS가 포함되어 있다면 CSSOM(CSS Object Model) Tree 구성 작업도 함께 진행
- 두 트리를 결합하여 렌더링 트리를 만든다(style)
- parsing 단계에서 생성된 DOM Tree와 CSSOM Tree를 매칭시켜서 Render Tree를 구성
- Render Tree는 실제로 화면에 그려질 Tree
- 예를 들면 Render Tree를 구성할때 visibility: hidden은 요소가 공간을 차지하고, 보이지만 않기 때문에 Render Tree에 포함이 되지만, display: none 의 경우 Render Tree에서 제외
- 렌더링 트리에서 각 노드의 위치와 크기를 계산한다(레이아웃)
- Render Tree를 화면에 어떻게 배치해야 할 것인지 노드의 정확한 위치와 크기를 계산
- 루트부터 노드를 순회하면서 노드의 정확한 크기와 위치를 계산하고 Render Tree에 반영
- 만약 크기 값을 %로 지정하였다면 레이아웃 단계에서 %값을 계산해서 픽셀 단위로 변환
- 계산된 값을 이용해 각 노드를 화면상의 실제 픽셀로 변환하고, 레이어를 만든다(paint)
- 레이아웃 단계에서 계산된 값을 이용해 Render Tree의 각 노드를 화면상의 실제 픽셀로 변환. 이 때 픽셀로 변환된 결과는 하나의 레이어가 아니라 여러 개의 레이어로 관리
- 스타일이 복잡할수록 paint 시간도 늘어난다
- 레이어를 합성하여 실제 화면에 나타낸다(composite)
- paint 단계에서 생성된 레이어를 합성하여 실제 화면에 나타낸다.
- HTML 파일과 CSS파일을 파싱해서 각각 트리를 만든다(parsing)
'Codeit > Weekly Paper' 카테고리의 다른 글
[Weekly Paper] 6. Virtual DOM & React 배열 렌더링 key (0) | 2023.11.26 |
---|---|
[Weekly Paper] 5. HTTP 메소드 & 코드 출력 예상 (0) | 2023.11.19 |
[Weekly Paper] 3. 동등 연산자(==) VS 일치 연산자(===) & 복사 (0) | 2023.11.05 |
[Weekly Paper] 2. Git branch merge & Git Flow (0) | 2023.10.29 |
[Weekly Paper] 1. Cascading & Position (0) | 2023.10.22 |
Comments