참고자료 제로초 인간JS엔진 되기
알고 있던 내용 복습과 몰랐던 내용 아카이빙
const add = (a, b) => a + b;
function calculator(func, a, b) {
return func(a, b);
}
add(3, 5);
calculator(add, 3, 5);
const onClick = () = (e) => {
console.log('hello')
}
document.querySelector('button').addEventListener('click',onClick()); // 고차함수를 호출했을 때 고차함수의 리턴값을 생각해보면 된다.
===
document.querySelector('button').addEventListener('click',(e) => {
console.log('hello')
});
const x = 'x';
function c() {
const y = 'y';
console.log('c');
function b() {
const z = 'z';
console.log('b');
c();
}
}
function a() {
const x = 'x';
console.log('a');
console.log(x) // scope는 내부에서 외부로 퍼져나가는 형식이다.
b();
}
a(); // 하단 lexical scope에서 a 함수 내에b가 선언되지 않았기 때문에 에러 발생
c();
lexical scope (선언으로만 보면 확인이 편하다, 호출 x)
c -> annonymous
a -> annonymous
b -> c -> annonymous(a를 포함)
console.log(a) // undefined
var a = 1;
호이스팅은 변수가 선언되는 과정을 살펴보면 이해하기 쉽다.
변수 선언은 선언/초기화/할당의 과정을 거친다. 기본적으로 모든 함수와 변수는 scope의 최상단에서 선언된다.
var과 함수선언문의 경우 선언과 초기화를 동시에 하게 된다. 이 과정에서 var에 아직 값이 할당되지 않았기 때문에 undefined로 초기화되며, 함수는 내부 값으로 초기화 되기 때문에 접근이 가능한 것이다.
반대로 나머지 const,let,class, 함수표현식의 경우 선언과 초기화가 분리해서 일어나기 때문에 초기화되지 않은 함수,변수에 접근을 하면 에러가 발생하는 것이다.