javascript

JavaScript Closures MDN 예제 해석

2021. 9. 10. 17:55
728x90
반응형

클로저 개념은 여기를 참고해주세요

https://wouldyou.tistory.com/15

 

JavaScript closure 개념

일단 읽어보시면 좋을 것 같습니다! https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures 클로저 - JavaScript | MDN 클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다. 클로저를 이해하려면 자..

wouldyou.tistory.com

 

MDN예제를 보다가 막히는 부분을 적어봅니다

 

function countSeconds(howMany) {
for (var i = 1; i <= howMany; i++) {
console.log("for :", i);
setTimeout(function () {
console.log(i);
}, i * 1000);
}
};
countSeconds(3);

이 코드는 인사이드 자바스크립트 책에 나오는 코드입니다.

의도는 1초후 1, 2초후2, 3초후 3이 찍히는 것입니다. 

그러나 결과는 4가 1초에 한번씩 3번 찍힙니다.

 

왜 이런일이 일어날까요?

 

이미 for함수가 끝난 후에 setTimeout이 i를 참조하기 때문입니다. for 문이 끝나면 i는 이미 4로 변했기 때문에 4만 출력되는 것입니다.

 

JS는 single thread입니다. 그래서 하나의 thread에 큐를 보관합니다.

setTimeout은 이 큐가 아닌 별도의 stack에 들어있습니다. 그래서 for문을 다 돌린다음에 별도의 stack에 있는 setTimeout에 접근하여 이런 결과가 나온것입니다. 

 

onfocus등의 event함수도 마찬가지입니다.

 

function showHelp(help) {
document.getElementById('help').innerHTML = help;
}
function makeHelpCallback(help) {
return function() {
showHelp(help);
};
}
function setupHelp() {
var helpText = [
{'id': 'email', 'help': 'Your e-mail address'},
{'id': 'name', 'help': 'Your full name'},
{'id': 'age', 'help': 'Your age (you must be over 16)'}
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
}
}
setupHelp();

MDN예제에서 onfocus함수도 별도의 stack에 있어 나중에 접근하기 때문에 예상과는 다른 결과가 나옵니다.

이를 해결하기 위해서는 즉시실행함수를 사용해주면 됩니다.

 

 

728x90
반응형

'javascript' 카테고리의 다른 글

[javascript] javascript에서 private 사용하기, javascript 공개, 비공개 메소드 만들기  (0) 2021.11.10
[javascript] object에서 key값에 접근할 때 오류, object[" "]형식으로 접근하기  (0) 2021.10.22
JavaScript closure 개념  (0) 2021.09.10
인턴의 첫번째 과제 코드 리뷰  (0) 2021.09.10
function과 function()의 차이, onclikc=function과 onclick=function()의 차이  (0) 2021.08.19
'javascript' 카테고리의 다른 글
  • [javascript] javascript에서 private 사용하기, javascript 공개, 비공개 메소드 만들기
  • [javascript] object에서 key값에 접근할 때 오류, object[" "]형식으로 접근하기
  • JavaScript closure 개념
  • 인턴의 첫번째 과제 코드 리뷰
우주유령
우주유령
우주유령
우주
우주유령
전체
오늘
어제
반응형
  • 분류 전체보기 (143)
    • javascript (29)
    • java (26)
    • Network,CI,CD (16)
    • React (7)
    • SQL (2)
    • Spring (20)
    • JSP (1)
    • Tools (20)
    • Vue (3)
    • publishing (2)
    • jpa (8)
    • 책 (1)
    • Test (6)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

최근 글

hELLO · Designed By 정상우.
우주유령
JavaScript Closures MDN 예제 해석
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.