꾸준히 추가중입니다.👍
자바스크립트의 특징은 싱글스레드를 이용하면서 논-블로킹 언어.
setTimeout
,이벤트 처리 같은 내용들은 이전에 실행하고있던 내용들을 막지않기 때문에 논 블로킹 언어라고 하는것임.공통점: 비동기를 처리하기 위한 방법
Callback
은 어떤 코드에 인자로 넘겨주는 함수를 말하며, 인자를 받은 함수가 어느 시점에 부를것인가에 대한 제어권을 가지는것이 특징
Promise
는 비동기 작업을 할수 있는 객체를 말하며, 비동기 처리가 끝나면 Promise
객체를 리턴해줌.
pending
), 이행(처리가 성공된 상태,fulfilled
), 거절(처리가 실패한 상태,rejected
) 총 3가지 상태를 가지고 있음.Callback
은 중간과정이 계속해서 주가되면, 코드의 들여쓰기가 깊어지는등 가독성에 문제가 있어서, 지금은 콜백 방식을 지양하고 있음(콜백지옥). 이를 개선하기위해 Promise
에서는 then
메소드의 메소드 체이닝 기법을 이용하여 가독성 좋게 비동기 처리를 할 수 있다.
Promise
는 최종 호출된 결과값을 리턴할수 있기 때문에, 외부에서 사용할수있지만, Callback
은 콜백함수 밖에서는 결과값을 사용할수가 없는것이 차이점.
자바스크립트 코드가 복잡해지면서, 콜백함수 안에 또다른 콜백함수를 중첩해서 사용하다보면 쌓여가는 들여쓰기 때문에 코드의 가독성이 나빠지는 현상.
이를 대신하기 위해 Promise
와 async~await
를 이용 하면 가독성을 해치지않는 선에서 비동기를 처리할 수 있다.
비동기처리 함수를 일반함수처럼 처리하기 위한 문법.
사용방법은 async
구문을 비동기 처리 내용이 있는 function
앞에 붙인다(async function asyncFunc(){...}
).
async
함수는 무조건 Promise
객체를 리턴하며, 만약 async 함수의 반환값이 Promise
가 아니라면 암묵적으로 Promise
로 감싸진다.await
는 async
를 붙인 함수를 호출할때 붙이며, await
안의 내용의 실행이 끝날때까지 다음 소스내용은 동작하지않음. (const result = await asyncFunc()
).
await
를 일반 함수에 붙이면 오류가 발생한다.await
는 최상위 레벨 코드에서 작동하지 않음.Promise
는 Promise.all
를 이용하여 여러개의 비동기 처리를 병렬식으로 처리가 가능.
async~await
는 await
를 붙여 호출하는 비동기 로직이 처리될때까지, 아래 내용이 실행이 연기 되는것의 차이.
Promise
는 then()
과 catch()
메서드를 통한 에러처리. async~await
는 try~catch
구문을 이용하여 에러처리.
this
객체의 정보FILO
)let
,const
는 호이스팅이 발생하지만, 초기화가 되지않기때문에 에러가 발생.function outer(){
let string = 'Hello';
return function(){
let innerString = 'JS';
console.log(`${string} ${innerString}`);//함수 선언시 외부환경인 string변수를 참조하고있었기때문에, 함수를 호출시, string은 클로저가 생성이 되어 Hello JS가 나올수가 있음.
}
}
const func = outer();
console.log(func());
변수를 선언하고 값을 할당받기위해 사용하는 키워드
var | let | const | |
---|---|---|---|
재선언 | 가능 | 불가능 | 불가능 |
재할당 | 가능 | 가능 | 불가능(객체&배열의 요소는 변경 가능) |
유효 범위 | 함수scope | 블록scope({}) | 블록scope({}) |
호이스팅 | 발생 | 발생하지만,초기화X | 발생하지만,초기화X |
map
,filter
등) : 호출하면 결과배열객체를 리턴해주기 때문에 배열 메소드를 이어서 사용할 수 있다.Promise
:then() 메서드 호출 시 새로운 프로미스 객체가 반환되기때문에 지속적으로 then()
또는catch()
를 사용 할 수 있다.이벤트 버블링은 물안에 있는 공기방울이 물 위로 떠오르는것처럼 이벤트 발생 시 선언한 곳에서 최상단까지(body
) 이벤트가 발생하는것을 말함.
브라우저는 기본적으로 이벤트를 감지했을 때 해당 요소의 이벤트가 발생하고, 이벤트가 전파되어 최상단 요소의 등록된 이벤트까지 발생이 됨.
이벤트 캡쳐링은 반대로 최상단으로부터 이벤트 선언부까지 이벤트가 전파되어 발생하는 것을 말함.
이벤트 캡쳐링을 하고싶다면, addEventListener(type, listener, options)
API 에서 마지막파라미터인 options
객체에서 capture
속성값을 true
로 하면 됨.
이벤트 위임이란 특정 요소에만 이벤트를 선언하는것이 아닌, 상단요소에 이벤트를 선언함으로써, 하단 노드들의 이벤트 제어를 위임하는 패턴을 말함.
주로 동적으로 추가되는 요소에 대한 이벤트를 일일히 주기보다는 상단 요소에 이벤트를 선언. 요소가 추가될때마다 이벤트를 추가하는 작업을 안해도 된다는것이 장점.
실행컨텍스트가 생성이 되었을때 결정.
window
객체.nodejs 는 global
객체.this
는 누가 호출을 했느냐에 따라 달라짐.const obj={
outerFunc(){
console.log(this);//{outerFunc: ƒ}
const innerFunc = function(){
console.log(this);
}
innerFunc();//단독으로 호출했기때문에 window객체를 가리킴
const obj2 = {
outerFunc:innerFunc
}
obj2.outerFunc(); // this를 로그에 출력하는 함수이지만, obj2객체에서 호출했기때문에 {innerMethod: ƒ}가 나옴.
}
}
obj.outerFunc();
this
를 바인딩 과정이 없기때문에, 스코프 체인으로 인해 상위 스코프에 있는 this
를 그대로 활용<div class="div1"></div>
<div class="div2"></div>
document.querySelector('.div1').addEventListener('click',function(){
console.log(this); //<div class="div1"></div>
})
document.querySelector('.div2').addEventListener('click',()=>{
console.log(this); //window
})
this
const callFunc = function(){
console.log(this);
}
const obj = {
execute:function(cb){
cb(); //window
cb.call(this);//{execute: ƒ}
}
}
obj.execute(callFunc);
this
function Human (name,age){
this.name=name;
this.age=age;
console.log(this); // {name:'홍길동',age:30}
}
const HongGilDong = new Human('홍길동',30);
bind
,apply
,call
을 통한 명시적으로 binding하는 this.(call
,apply
는 바인딩 즉시 실행)const obj ={
callFunc(){
const innerFunc = function(){
console.log(this); //{callFunc: ƒ, bindFunc: ƒ, applyFunc: ƒ}
}
innerFunc.call(this);
},
bindFunc(){
const innerFunc = function(){
console.log(this);//{callFunc: ƒ, bindFunc: ƒ, applyFunc: ƒ}
}.bind(this)
innerFunc();
},
applyFunc(){
const innerFunc = function(){
console.log(this);// {callFunc: ƒ, bindFunc: ƒ, applyFunc: ƒ}
}.apply(this);
}
}
obj.callFunc();
Number
,String
,Boolean
,null
,undefined
이고, 참조형 변수는 Object
,Array
,Function
,Date
등을 가리킴JSON.stringfy
메서드를 통해 간단한 깊은 복사 가능)Object.assign
을 이용.