for (var i = 1; i < 6; i++) {
setTimeout(function timer() {
console.log(i);
}, i * 1000);
}
for문 시작
i=1, setTimeout 함수 실행 => timer 함수 선언 & 예약 (1초)
i=2, setTimeout 함수 실행 => timer 함수 선언 & 예약 (2초)
i=3, setTimeout 함수 실행 => timer 함수 선언 & 예약 (3초)
i=4, setTimeout 함수 실행 => timer 함수 선언 & 예약 (4초)
i=5, setTimeout 함수 실행 => timer 함수 선언 & 예약 (5초)
i=6, for문 종료
예약되었던 timer 함수 실행 => console.log(i); // 선언될 당시 주변 환경(전역)이 가지고 있는 i=6
예약되었던 timer 함수 실행 => console.log(i); // 선언될 당시 주변 환경(전역)이 가지고 있는 i=6
예약되었던 timer 함수 실행 => console.log(i); // 선언될 당시 주변 환경(전역)이 가지고 있는 i=6
예약되었던 timer 함수 실행 => console.log(i); // 선언될 당시 주변 환경(전역)이 가지고 있는 i=6
예약되었던 timer 함수 실행 => console.log(i); // 선언될 당시 주변 환경(전역)이 가지고 있는 i=6
function setTimer(j) {
setTimeout(function timer() {
console.log(j);
}, j * 1000);
}
for (var i = 1; i < 6; i++) {
setTimer(i);
}
setTimer 함수 선언
for문 시작
i=1, setTimer 함수 실행 => setTimeout 함수 실행 => timer 함수 선언 & 예약 (1초)
i=2, setTimer 함수 실행 => setTimeout 함수 실행 => timer 함수 선언 & 예약 (2초)
i=3, setTimer 함수 실행 => setTimeout 함수 실행 => timer 함수 선언 & 예약 (3초)
i=4, setTimer 함수 실행 => setTimeout 함수 실행 => timer 함수 선언 & 예약 (4초)
i=5, setTimer 함수 실행 => setTimeout 함수 실행 => timer 함수 선언 & 예약 (5초)
i=6, for문 종료
예약되었던 timer 함수 실행 => console.log(j); // 선언될 당시 주변 환경(setTimer 함수)가 가지고 있는 j=1
예약되었던 timer 함수 실행 => console.log(j); // 선언될 당시 주변 환경(setTimer 함수)가 가지고 있는 j=2
예약되었던 timer 함수 실행 => console.log(j); // 선언될 당시 주변 환경(setTimer 함수)가 가지고 있는 j=3
예약되었던 timer 함수 실행 => console.log(j); // 선언될 당시 주변 환경(setTimer 함수)가 가지고 있는 j=4
예약되었던 timer 함수 실행 => console.log(j); // 선언될 당시 주변 환경(setTimer 함수)가 가지고 있는 j=5
즉, 퀴즈 1과 퀴즈 2의 답에 차이가 나는 이유는?
퀴즈 1은 선언 당시의 주변 환경이 전역으로 동일하고 (i를 공유하고),
퀴즈 2는 서로 다른 setTimer 함수(실행 컨텍스트) 안에서 각각 선언되고, 그때의 j는 다 다르다. (j를 공유하지 않는다.)
rabbits(n) = rabbits(n-1) + rabbits(n-2), rabbits(1) = 1, rabbits(0) = 0
function rabbits(n) {
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
return rabbits(n - 1) + rabbits(n - 2);
}
debugger;
rabbits(3);
factorial 함수 완성시키기
function factorial(n) {
if(n === 1) {
return 1
}
return n * factorial(n-1)
}
const result = factorial(5);
console.log(result === 120);
Higher Order Function, 고차 함수
함수를 인자로 받거나 함수를 반환하는 함수
인자로 함수를 받지 않고 함수를 반환하지도 않는다면, 일차원 함수 (First Order Function) / 일반 함수
예시
function repeat(n, callback) {
for (let i = 1; i <= n; i++) {
callback(i);
}
}
repeat(5, console.log);
repeat(10, window.alert);
repeat(20, console.warn);
map
const nList = [1, 2].map(function (val) {
return val + 3;
});
// [4, 5]
reduce
const result = [1, 2, 3].reduce(function (acc, val) {
return acc + val;
});
// 6
일급 객체의 조건
자바스크립트에서 함수는 위와 같은 작업이 가능하므로, 함수는 일급 객체이다.