: 사용자가 정의할 수 있고, 재사용가능하고, 캡슐화 가능한 HTML 태그를 생성할 수 있는 웹 플랫폼 API
<app-drawer/>
과 같이 사용할 수 없다.[<template>](https://developer.mozilla.org/ko/docs/Web/HTML/Element/template)
과 [<slot>](https://developer.mozilla.org/ko/docs/Web/HTML/Element/slot)
엘리먼트는 렌더링된 페이지에 나타나지 않는 마크업 템플릿을 작성할 수 있게 해준다. 그 후, 커스텀 엘리먼트의 구조를 기반으로 여러번 재사용할 수 있다.생명주기에 넣은 함수들은 동기적으로 작동한다.
예를들어 el.setAttribute()
요소를 호출하면 브라우저는 즉시 attributeChangedCallback()
을 호출된다.
disconnectedCallback()
도 마찬가지로, el.remove()
을 사용해 요소가 DOM에서 제거된 직후 호출된다.
render() 함수를 따로 생성해서 connectedCallback, attributeChangedCallback()에서 사용해주면 편리하다.
: 실행할 코드에 제공할 환경 정보들을 모아놓은 객체로 자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념입니다.
자바스크립트는 실행 컨텍스트가 활성화되는 시점에 다음과 같은 현상이 발생합니다
동일한 환경이 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트로 구성하고, 이를 콜 스택에 쌓아올렸다가, 가장 위에 쌓여있는 컨텍스트와 관련된 코드들을 실행하는 식으로 전체 코드의 환경과 순서를 보장합니다.
①
var a = 1; // 전역 컨텍스트
function outer () {
function inner () {
console.log(a); // undefined
var a = 3;
}
inner(); // ②
console.log(a); // 1
}
outer(); // ③
console.log(a); // 1
이렇게 어떤 실행 컨텍스트가 활성화될 때 자바스크립트 엔진은 해당 컨텍스트에 관련된 코드들을 실행하는 데 필요한 환경 정보들을 수집해서 실행 컨텍스트 객체에 저장합니다.
VariableEnvironment
LexicalEnvironment
ThisBinding
실행 컨텍스트를 생성할 때는 VariableEnvironment
와 LexicalEnvironment
가 동일한 내용으로 구성되지만, LexicalEnvironment
는 함수 실행도중에 변경사항이 즉시 반영되고, VariableEnvironment
는 초기상태를 유지합니다.
VariableEnvironment
와 LexicalEnvironment
는environmentRecord
- 매개변수명, 변수의 식별자, 선언한 함수의 함수명 등을 수집함
outerEnvironmentReference
- 바로 직전 컨텍스트의 LexicalEnvironment
정보를 참조함
로 구성되어있습니다.
호이스팅
호이스팅은 코드 해석을 좀 더 수월하게 하기 위해 environmentRecord
의 수집 과정을 추상화한 개념으로, 실행 컨텍스트가 관여하는 코드 집단의 최상단으로 끌어올린다고 해석하는 것입니다.
변수 선언과 값 할당이 동시에 이뤄진 문장은 ‘선언부’만을 호이스팅하고, 할당과정은 원래 자리에 남아있게 되는데, 여기서 함수 선언문과 함수 표현식의 차이가 발생합니다!!
스코프
변수의 유효범위를 말합니다.
outerEnvironmentReference
는 해당 함수가 선언된 LexicalEnvironment
를 참조합니다.
코드 상 어떤 변수에 접근하려 하면 현재 컨텍스트의 LexicalEnvironment
를 탐색해서 발견되면 그 값을 반환하고, 발견하지 못할 경우 다시 outerEnvironmentReference
에 담긴 LexicalEnvironment
를 참색하는 과정을 거칩니다.
LexicalEnvironment
까지 탐색해도 해당 변수를 찾지 못하면 undefined를 반환합니다.this
this에는 실행 컨텍스트를 활성화하는 당시에 지정된 this가 저장됩니다. 함수를 호출하는 방법에 따라 값이 달라지며 지정되지 않은 경우에는 전역 객체가 저장됩니다.
웹 컨텍스트에서 observer가 변경되는 attirbute를 인식을 못하는 이슈
setAttribute
로 아무리 속성을 변경해도 적용이 안됐다.static get observedAttributes() {
return ["isStarred"];
}
...
this.addEventListener("click", (event) => {
event.stopPropagation();
this.setAttribute("isStarred", !isStarred);
});
→ 케니’s 조언 : 아마 Camel 형식이라 그렇지 않을까? HTML에서의 attribute는 다 소문자로 변경됨 (← OMG 확인이 필요하다😭😭)