자바스크립트 동작 원리
자바스크립트 함수가 실행되는 과정
자바스크립트 코드의 실행 1
어떤 코드가 없어도 자바스크립트 엔진이 위의 세가지 변수를 만들어 초기화함
- this는 코드가 실행되는 시점의 환경을 가리키는 객체를 의미
- 자바스크립트 엔진은 코드가 없어도 실행 환경(실행 컨텍스트)을 초기화한다.
- 스코프(scope)는 코드가 현재 실행되는 환경, 맥락(context)을 의미한다.
- this 포인터, 스코프에 저장된 변수들, 스코프 체인 등이 환경에 포함된다.
- this 포인터의 경우, 글로벌 스코프에서는 window를 가리킨다.
자바스크립트 코드의 실행 2
function my Func(){ let a = 10 let b = 20 function add(first, second){ return first + second } return add(a,b) } myFunc()
- 어떤 코드도 없는 상태처럼 최상위 컨텍스트 생성(글로벌 컨텍스트)
- myFunc()가 실행 되었을 때
- 또 다른 실행 컨텍스트가 만들어지고 기존의 컨텍스트는 그대로 존재
- 실행 컨텍스트가 쌓이는 구조는 스택형태
- strict mode는 자바스크립트가 실행될 때 어떤 모드를 정해서 실행되는 것(대충 이런 모드가 있구나 하는 정도만 알고있기)
- Scope chain의 global은 바로 이전의 실행 컨텍스트를 가리켜서 만일 다른 변수를 찾아야 할 경우가 있으면 Scope chain을 따라서 변수를 검색하거나 하는 용도로 활용
- myFunc()함수가 끝나면 위의 컨텍스트는 제거, global scope로 돌아가게 됨
- add function 호출
정리
- 함수가 실행되면, 함수 스코프에 따라 환경이 만들어진다.
- this, 함수 스코프의 변수들, 그리고 스코프 체인이 형성된다.
- 스코프 체인을 따라 글로벌 환경에 도달한다.
자바스크립트의 실행 3
let o = { name: 'Daniel', method: function(number){ return this.name.repeat(number) } } function myFunc(){ let n = 10 return o.method(n) } myFunc()
- 어떤 코드도 없는 상태처럼 최상위 컨텍스트 생성(글로벌 컨텍스트)
- myFunc()의 실행 컨텍스트
- myFunc()에서 o.method 호출어떤 객체에 속한 메소드의 경우에는 this가 그 객체를 가리킴(여기서는 o), Scope cahin에 myFunc()가 들어가있어야함
정리
- 객체 메서드의 경우, 메서드 환경의 this는 해당 객체를 가리키게 된다.
- 하지만 this가 가리키는 것은 환경에 따라 변할 수 있다.
실행 컨텍스트
실행 컨텍스트
- 실행 컨텍스트 혹은 실행 맥락은 자바스크립트 코드가 실행되는 환경.
- 코드에서 참조하는 변수, 객체(함수 포함), this 등에 대한 레퍼런스가 있다.
- 실행 컨텍스트는 전역에서 시작해 함수가 호출될 때 스택에 쌓이게 된다.
실행 컨텍스트 스택
- 글로벌 실행 컨텍스트
- 글로벌 실행 컨텍스트를 만들고 그 안에 variable object 안에 변수 a와 함수 f1이 들어가게 됨.
- console은 window 객체 밑에 있는 변수지만 편의상 여기 넣어놨음
- f1() 호출 했을 때 function execution context가 생성
- 변수 b, print, f2 함수가 f1의 execution context 안에 변수로 들어가있게 됨
- f2() 함수 실행
- 스코프 체인을 따라서 실행 컨텍스트를 찾고 a와 b의 값을 참조
- print함수 호출
정리
- 자바스크립트가 실행될 때 전역 실행 컨텍스트(global execution context)가 만들어진다.
- 함수가 실행될 때 함수 실행 컨텍스트가 만들어진다.
this가 가리키는 것
dynamic binding
함수 호출되는 4가지 상황
- 함수 호출 : 함수를 직접 호출
- 메서드 호출 : 객체의 메서드를 호출
- 생성자 호출 : 생성자 함수 호출
- 간접 호출 : call, apply 등으로 함수를 간접 호출
- 그 외 콜백 함수의 호출이 있음
- 콜백 함수는 특정 동작 이후 불려지는 함수
- 보통 다른 함수의 인자로 보내지는 함수를 의미
bind는 특정 this변수에 해당되는 어떠한 객체를 메서드에 묶어주는 함수. 여기서는 printName 안에서 this값이 p의 this값을 갖도록 함.(즉 ,this값이 p를 가리킴)
- 함수는 이렇듯 다양한 상황(환경)에서 호출될 수 있다.
- 함수의 호출 환경에 따라 this는 동적으로 세팅된다.
- 이렇게 this가 환경에 따라 바뀌는 것을 동적 바인딩(dynamic binding)이라 한다.
- bind, apply, call 등으로 this가 가리키는 것을 조작할 수 있다.
- 화살표 함수의 this와 일반 함수의 this
this를 조작하는 경우
화살표 함수와 일반 함수의 this
화살표 함수 vs 일반 함수
- 화살표 함수의 this는 호출된 함수를 둘러싼 실행 컨텍스트를 가리킨다.
- 일반 함수의 this는 새롭게 생성된 실행 컨텍스트를 가리킨다.
정리
- 화살표 함수의 this는 정해지면 바꿀 수 없다.
- call, bind, apply를 사용해도 바뀌지 않는다.
- setTimeout 등 this가 바뀌는 상황에서 유용하다.
화살표 함수는 this 값을 바꿀 수 없다.
자바스크립트 Closure
함수는 일급 객체(first-class object)
- 일급 객체란, 다른 변수처럼 대상을 다룰 수 있는 것을 말한다.
- 자바스크립트에서 함수는 일급 객체이다.
- 즉, 자바스크립트에서 함수는 변수처럼 다룰 수 있다.
클로저(closure)
- 자바스크립트 클로저는, 함수의 일급 객체 성질을 이용한다.
- 함수가 생성될 때, 함수 내부에서 사용되는 변수들이 외부에 존재하는 경우 그 변수들은 함수의 스코프에 저장된다.
- 함수와 함수가 사용하는 변수들을 저장하는 공간을 클로저라 한다.
✔함수를 생성해서 리턴하는 함수를 팩토리 함수라고 함
card1과 card2 에 각각 클로저 할당하게 됨(card2의 title과 content는 card1의 title, content와는 별도의 메모리 공간에 독자적으로 할당)
Ex)
ES6 Rest, Spread Operator
Rest Operator
- 함수의 인자, 배열, 객체 중 나머지 값을 묶어 사용하도록 한다.
- 함수의 인자 중 나머지를 가리킨다.
- 배열의 나머지 인자를 가리킨다.
- 객체의 나머지 필드를 가리킨다.
함수 인자 Rest Operator
객체 Rest Operator
rest가 배열이 아니라 객체
배열 Rest Operator
Spread Operator
- 묶인 배열 혹은 객체를 각각의 필드로 변환한다.(펼치는?)
- 객체는 또 다른 객체로의 spread를 지원한다.
- 배열은 또 다른 배열의 인자, 함수의 인자로의 spread를 지원한다.
객체 Spread Operator
배열 Spread Operator
Author And Source
이 문제에 관하여(자바스크립트 동작 원리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@js2_11/자바스크립트-동작-원리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)