최근 회사에서 시작한 프로젝트를 타입스크립트로 작성하면서 알게되는 새로운 사실들이 있다. 그 중 하나가 setTimeout
이 리턴하는 값이 단순한 숫자라는 것이었다.
const timeoutId: number = setTimeout(() => {}, 1000)
나는 이 값이 무슨 해시값이라도 되는 거라고 생각했었는데, 콘솔을 찍어보니 그냥 43
같은 아주 작고 단순한 숫자였다.
id pool
setTimeout
과 setInterval
이 리턴하는 id는 Window
나 Worker
같은 Object가 가지고 있는 id pool에서 발급되는 값이다. 두 메소드가 각각 리턴하는 id는 사실 동일한 pool에서 발급되기 때문에, setTimeout
으로 리턴받은 id를 clearInterval
로 제거하는 등의 방법도 가능하다.(반대도 마찬가지)
어떻게 중복이 안되지?
timeoutID가 "단순한 숫자"라는 사실이 불편(?)했던 이유는 "이런게 id?"라는 생각이 머리를 스쳤기 때문이다. 모름지기 id란 중복이 없는 고유한 값이어야 하는데 이렇게 작고 단순한 숫자는 너무 중복되기 쉬우니까.
그러나 다행히도 중복 값이 발급될 염려는 없다. 이 값은 id pool이 속한 Object가 1부터 순차적으로 값을 증가시키며 발급하는 값이기 때문이다. (그냥 그게 다다.😅) 지금 문서를 작성하고 있는 이 티스토리 페이지에서 한번 아이디를 발급해봤다.
이 티스토리 페이지의 Window
(?) Obejct가 가지고 있는 pool에서 17503번째로 발급한 id를 리턴받았다.
(이 pool은 아마 이 티스토리 페이지를 서빙하는 애플리케이션과 관련이 있겠지만, 그것까지는 잘 모르겠다.)
새로운 탭을 열고 id를 발급받아 보면?
2
라는 id를 발급해준다. 새 탭을 열자마자 내부적으로 실행되는 setTimeout
혹은 setInterval
이 있는 모양이다.
이번에는 Incognito 모드로 테스트를 해봤다.
여기에서는 1
을 발급해준다. Incognito 모드와 일반 모드에서 차이가 있나보다.
랜덤값이 아니라 단순히 증가하는 값이라면 한계도 있겠네?
이론적으로는 하나의 Object에서 231-1개까지 가능하다고 한다. 그 이상 발급 받으면 무한루프에 빠질수도 하는데, 현실적으로 일어날 가능성은 "거의 없다"고 여겨진다. 그래서인지, 이에 대해 브라우저 개발자들이 적절히 대응을 해놨는지도 사실 확실치 않다.
참조
NDM - setTimeout
stackoverflow - 답변자가 무한루프에 빠지는 경우에 대한 대응과 관련하여 2018년에 브라우저 개발자에게 질문을 남겼지만, 아직 답이 없는 모양이다
'Product Development > Javascript' 카테고리의 다른 글
new Date()의 argument로 dateString을 사용할 때는 "yyyy-mm-dd"형식을 사용하자 (0) | 2023.07.22 |
---|---|
빈 배열에 every() 를 실행하면 언제나 true를 리턴한다. (0) | 2023.07.15 |
Array(n)에는 map()을 쓸 수 없다. (1) | 2023.07.14 |