방식 | 로드 방식 | 호이스팅 | 장점 | 단점 |
---|---|---|---|---|
선언식 | 코드가 실행되기 전 로드 | O | 코드상 상위에 호출 가능 | |
표현식 | 인터프리터[1]가 해당 함수의 코드 줄에 도달 할때만 로드 | X | 1. 가독성로 사용⬆ 2. 클로저(Closure)[2]로 사용 3. 인자로 사용 | 코드상 상위에 호출 불가 |
fd()
fe() // ReferenceError
function fd() {
console.log('선언식 입니다.')
}
let fe = () => {
console.log('표현식 입니다.')
}
fd()
fe()
function tabsHandler(index) {
return function tabClickEvent(event) {
// 바깥 함수인 tabsHandler 의 index 인자를 여기서 접근할 수 있다.
console.log(index); // 탭을 클릭할 때 마다 해당 탭의 index 값을 표시
};
}
var tabs = document.querySelectorAll('.tab');
var i;
for (i = 0; i < tabs.length; i += 1) {
tabs[i].onclick = tabsHandler(i);
}
// 클로저 미사용시
// for (i = 0; i < tabs.length; i += 1) {
// tabs[i].onclick = function (event) {
// console.log(i); // 어느 탭을 클릭해도 항상 tabs.length (i 의 최종 값) 이 출력
// };
// }
// 클로저 미사용을 좀더 풀어서 쓰면
// var logIndex = function (event) {
// console.log(i); // 3
// };
// for (i = 0; i < tabs.length; i += 1) {
// tabs[i].onclick = logIndex;
// }
function test(callback) {
callback();
}
function cbFunction1 {
console.log('콜백 함수1')
}
const cbFunction2 = () => {
console.log('콜백 함수2')
}
test(cbFunction1)
test(cbFunction2)
// 중간 변수 저장없이 사용
test(() => { // 인자로 사용
console.log('콜백 함수3')
})
// filter((e) => e > 0) 이것도한 인자로 사용과 동일
- 인터프리터 : 코드를 한 줄씩 읽어 내려가며 실행하는 프로그램
- 클로저(Closure='폐쇄') : 내부함수가 외부함수의 내부변수에 접근하는 것
2-1. 개인적으로 폐쇄적인 함수라고 생각하는데 이건 정확하지않음