자바스크립트 작동 원리
- 자바스크립트?
- 싱글 스레드 기반으로 동작하는 자바스크립트
- 이벤트 루프를 기반으로 동작하는 싱글 스레드 Node.js
JS Engine 종류
- 클라이언트에서 JavaScript를 실행하려면 JavaScript 엔진이 필요하다 -> 브라우저에 내장되어 있다.
- Chrome : V8
- Edge : Chakra
- Safari : Webkit
- Firefox : SpiderMonkey
JS Engine vs Rendering Engine
- Rendering Engine : HTML, CSS으로 작성된 마크업 관련된 코드를 웹 페이지에 rendering하는 역할
- Javascript Engine : Javascript으로 작성한 코드를 해석하고 실행하는 인터프리터
이벤트 핸들러
- 이벤트 : 브라우저에서 사용자의 조작이나 환경의 변화로 벌어진 사건
- 핸들러 : 이벤트에 대한 즉각적인 반응을 할 수 있도록 해주는 것
JS Engine의 3가지 영역
- Call Stack
- 하나의 call stack 사용 -> 하나의 함수가 실행되면 이 함수의 실행이 끝나기 전까지 다른 task 수행 불가
- Task Queue(event Queue)
- JS의 런타임 환경에서 처리해야하는 Task들을 임시 저장하는 대기큐
- call stack이 비어졌을 때 먼저 대기열에 들어온 순서대로 수행
- 자바스크립트에서 이벤트에 의해 실행되는 함수(핸들러)들은 비동기로 실행된다.
- 비동기로 호출되는 함수는 call stack이 아닌 task queue에 enqueue
- heap
- 동적으로 생성된 객체(인스턴스)는 힙에 저장된다.
- Event Loop
- event loop와 queue를 이용해서 동시에 여러 작업이 처리되는 것처럼 비동기 작업을 수행한다.
- 반복해서 call stack과 queue 사이의 작업들을 확인해서, call stack이 비워있는 경우 queue의 작업을 꺼내고 call stack에 넣는다.
function three() {
console.log('3')
}
function two() {
console.log('2')
}
function one() {
console.log('1') // 1 출력
}
one() // one 실행
setTimeout(() => { // 익명함수는 event queue
two()
}, 1000)
three() // three 실행
JS 엔진이 코드를 실행하기 위해 기동되면
1. 빌트인 객체(생성자 함수 포함) 생성
2. 실행 환경에 맞는 global 객체 생성
- browser 환경 : window 객체
- node.js 환경 : global 객체
- 자바스크립트 엔진이 소스코드를 불러와서 기동되면, 기본적인 빌트인 객체들을 만들어서 글로벌 객체(전역 객체)를 만들게 된다.
- 실행되는 환경에 따라 달라진다.
this
- 자바스크립트의 모든 함수는 실행될 때 마다 함수 내부에 this 객체가 추가된다.
- arguments(유사 배열 객체)와 함께 함수 내부로 암묵적 전달
- 함수가 호출된 상황에 따라 this가 달라진다.
1. 객체의 메소드 호출을 할 경우
- 메소드 : 객체의 프로퍼티가 함수인 경우
- 메소드를 호출할 경우 메소드를 호출한 객체를 바인딩 -> 현재 사용하는 객체
2. 함수를 호출할 경우
- 함수 내부 코드에 사용된 this는 전역 객체에 바인딩 -> window
3. 생성자 함수를 통해 객체를 생성할 때
- new 연산자 사용
- this는 객체 자신
- 빈 객체 생성 -> this 바인딩 -> 함수를 통해 생성된 객체, 부모 프로토타입 객체와 연결되어 있다.
- return문이 명시되어 있지 않은 경우 this는 바인딩 된 새로 생성한 객체가 리턴된다.
var myObject = {
name: "foo",
sayName: function() {
console.log(this);
}
};
myObject.sayName();
// console> Object {name: "foo", sayName: sayName()}
var value = 100;
var myObj = {
value: 1,
func1: function() {
console.log(`func1's this.value: ${this.value}`);
var func2 = function() {
console.log(`func2's this.value ${this.value}`);
};
func2();
}
};
myObj.func1();
// console> func1's this.value: 1
// console> func2's this.value: 100
var Person = function(name) {
console.log(this);
this.name = name;
};
var foo = new Person("foo"); // Person
console.log(foo.name); // foo
'프로그래밍 > JS' 카테고리의 다른 글
[JavaScript] 프로미스(promise), async/await (0) | 2022.10.06 |
---|---|
[JavaScript] 실행 컨텍스트, 렉시컬 환경, 클로저 (0) | 2022.07.05 |
[JavaScript] 일급 객체, 콜백 함수, 고차 함수 (0) | 2022.07.05 |
[JavaScript] 함수 호출, 즉시 실행 함수, 중첩 함수, 스코프 (0) | 2022.07.05 |
[JavaScript] 자바스크립트 함수, 함수 정의방법(선언문, 표현식, 화살표) (0) | 2022.07.05 |