호이스팅란 변수의 정의가 그 범위에 따라 선언과 할당으로 분리되는 것을 의미.
전역에서 선언된 변수는 전역 컨텍스트 촤상위로 끌어올려지며,
함수 내에 선언된 변수는 함수 최상위로 끌어올려집니다.
그리고 모든 선언문(var, let, const, function, function*, class)은 호이스팅 됩니다.
var 키워드로 선언한 변수는 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 선언 단계와
초기화 단계가 한번에 진행되며 let, const 키워드로 선언된 변수는 선언 단계가 이뤄지고
런타임 때 초기화와 할당이 이뤄집니다.
클로저는 함수가 선언될 때의 렉시컬 환경(Lexical Environment)을 기억하여, 함수가 해당 스코프 밖에서 실행되어도 그 환경에 접근할 수 있게 하는 기능
즉, 내부 함수가 외부 함수의 스코프에 접근할 수 있게 해주는 특성
왜냐하면 클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합 때문입니다.
코드로 생각해보면
function a(){
for(var i = 0 , i < 5; i ++){
setTimeout(()=>{
console.log(i);
},1);
}
}
a();
// 5,5,5,5,5 출력
// 클로저를 사용
function a(){
for(var i = 0 , i < 5; i ++){
(function(j){
setTimeout(()=>{
console.log(j);
},1);
})(i);
}
}
a();
// 0,1,2,3,4 출력
// 위처럼 나올수 있는건 스코프에 접근할수있기때문
싱글스레드이기때문에 오래걸리는 작업을 실행하면 브라우저의 먹통이 발생
Web Worker를 사용하면 브라우저의 부하를 줄일수있음