관련지식
javascript, recursive, callee
자바스크립트에서 익명함수는 매우 유용하게 사용되지만 익명함수 안에서 자기 자신을 다시 호출해야 할때는 상황이 애매해집니다.
var count = 10;
setTimeout(function() {
count--;
console.log(count);
}, 1000);
위 소스는 매우 간단한 타이머 함수를 구현한것이지만 당연히 제대로 동작하지는 않습니다. 반복호출되지 않기 때문이죠. 사실 동일 함수를 반복호출하려면 setInterval()
함수를 사용하는게 맞지만 반복주기가 일정하지 않던가 반복조건이 단순하지 않다면 setTimeout()
을 사용하는것이 더 편할수 있습니다. 여기서는 setTimeout()
으로 호출해야 하는 상황으로 가정하겠습니다.
어쨌든 위 소스는 익명함수가 단 한번 호출하고 끝이납니다. 카운트가 0이 될때까지 반복하려면 익명함수 안에서 setTimeout()
을 반복 호출해야 하는데 인자로 넘겨줄 익명함수를 어떻게 하면 될까요? callee
속성을 사용하면 됩니다.
var count = 10;
setTimeout(function() {
count--;
console.log(count);
if(count > 0) {
setTimeout(arguments.callee, 1000); //자기 자신 호출
}
}, 1000);
그런데 ES5의 strict mode
(엄격한 모드)에서는 callee
속성을 사용할수 없습니다. 따라서 그때는 함수에 명시적인 이름을 사용해야 합니다.
var count = 10;
setTimeout(function asdf() { //asdf 이름 붙임
count--;
console.log(count);
if(count > 0) {
setTimeout(asdf, 1000);
}
}, 1000);
함수에 파라미터를 넘겨야 할때도 상관없습니다.
setTimeout(function(count) {
count--;
console.log(count);
if(count > 0) {
setTimeout(arguments.callee.bind(this, count), 1000); //bind함수 호출
}
}.bind(this, 10), 1000); //bind함수 호출
'javascript' 카테고리의 다른 글
[javascript] 날짜 문자열을 Date 객체로 변환 (0) | 2020.01.06 |
---|---|
[javascript] Queue 와 Stack 구현 (0) | 2019.12.09 |
[javascript] 배열에 다른 배열의 데이터를 추가하는 방법 (0) | 2019.12.06 |
[javascript] 텍스트를 클립보드로 복사하는 3가지 방법 (2) | 2019.12.03 |
브라우저 알림(Notification) 팝업에 버튼 추가 with ServiceWorker (0) | 2019.11.25 |