나진짜어떻게든 혼자이해해보려다가 안되서 올려봄
지금 보면
전역실행컨텍스트에서 countSeconds() 함수가 실행되어서
새로운 실행컨텍스트가 생성되고
countSeconds 실행컨텍스트 안에서 setTimeout() 함수가 호출됬잖아.
그러면 setTimeout 실행컨텍스트가 생성되고
setTimeout 함수가 인자로 콘솔찍는 익명함수를 받았잖아.
그럼 setTimeout 함수에 루프마다 i = 1,2,3 을 받잖아.
그럼 3번의 내부함수(콘솔찍는거) 실행컨텍스트가 생성되는거임???
그리고 console.log(i)를 반환한상태에서
countSecond() 실행컨텍스트가 끝날때 환번에 반환되는거임?
근데 setTimeout 함수반환 값이 익명함수의 리턴값인데
지금 저 익명함수가 countSeconds의 내부함수가 아니라
setTimeout 함수의 내부함수인거임??
countSeconds 함수 실행이 다끝나고 나서 반환되니까
반환하는 시점의 i 참조값이 4가 되어버려서 4를 찍어내는거임??
countSecond 실행컨텍스트에서 실행이 끝나기 전에
setTimeout(f,1000)
setTimeout(f,2000)
setTimeout(f,3000)
이렇게 있다가
실행이끝났을때 countSeconds 실행이 끝나는 시점에는 i가 4여서 4가 찍혀서 반환되는거임..?
나 진짜 글쓰면서도 1시간 더 생각하다가 지금 1시간 30분쨰임 해결좀
울고싶다. 실행컨텍스트 부분도 계속 다시보고있는데
누가나좀도와줘
질문 글도 제대로한건지모르겠다.. 미안..
해당 댓글은 삭제되었습니다.
쓰지 말라는것보다 클로저를 아주 뼛속깊이 이해시키는 게 바로 var 아니겠냐
자바스크립트 개념서 보면서 이해하려는중인데 .. 그냥 써놓은걸 이해못하겠어서 화가남. const 나 let 처럼 블록레벨 스코프만배웠는데 휴 - dc App
ㅋㅋㅋㅋㅋㅋㅋㅋ 상구야. 저게 동기화 언어 쓰다가 JS로 넘어온 애들이 현타받고 근본없는 언어라고 욕하는 가장 큰 이유란다.ㅋㅋㅋㅋㅋㅋ
근데 저걸로 근본없는 언어라고 욕하는 애들은 그나마 개념잡힌 애들이지. 왜냐면 저거보다 훨씬 전에 근본없는 언어라고 욕하는 부분이 바로 var 그 자체거든.
동기화 비동기화 문제인데 settimeout이 참조하는 시점 앞에 for문이 돌아버리니까 settimeout은 실행시점에 i를 주세요 하면 결론적으로 for의 마지막 값만 던져버림. 그래서 어라? 왜 1 2 3 이렇게 안찍히고 3만 찍히지??? 하고 존나 고민함.ㅋㅋㅋㅋㅋ
아재도 너랑 똑같은 고민 한 7~8년 전에 12시간 했음.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 욕하면섴ㅋㅋㅋㅋㅋ
안그래도 이메일로 학습 교재들을 보내 주려고 했는데.. 나중에 이 메일 확인해 보렴.ㅋㅋㅋ 저녁늦게 보내지 시푸다.
넵 ㅠ 댓글 토대로 다시고민해볼게여 - dc App
겨재는 보내주시면 감사히 공부하겠습니다!! - dc App
해당 댓글은 삭제되었습니다.
아 감사합니다 써주신 용어들 찾아보면서 이해해볼게요 - dc App
저 문제의 문제점을 클로저를 이용해서 해결하는 파트에 나와서.. 클로저사용시유의할점? 암튼 ㄱㅅ합니다 밥만먹고 다시공부해볾 - dc App
근데 보면 루프사용시 유으이할점이라고 기본서에도잇고 생활코딩에도잇던데.. 저거를 이제 즉시실행함수로 만들어서 자유변수 i 참조하게끔 해서 settimeout인자로 포문의 현재시점 i 를 넘기는거를 클로저로 구현해서 해결했던것같은데.. 밥먹는중이라기억이잘안나요 - dc App
암튼 세세한답변 ㄱㅅ합니다정말로 - dc App
ㄱㅅ합니다 - dc App
마이크로 xx 매크로 oo setTimeout api는 매크로입니다 - dc App
var 타령 조까고들 있다.
var 로 문제를 담고 있는데 var 선에서 구조를 이해 해야지. let을 써야지 const를 써야지 하고 있으니 하는 말이다. 배가 아픈데 어떻게 해요 하면 복통에 대해 포커스를 잡아야지 요즘 자연환경이 어쩌고 대기의 기운이 어쩌고 그래서 배가 아파지니 밀가루 쳐먹지 마세요. 이딴 논리전개로 들어가면 어떻하냐.
제가 궁금했던건 저 코드의 실행 과정의 맥락을 이해못해서였읍니다.. 저 문제 자체를 해결하는건 딱히 관심없었고 돌아가는 구조가 궁금했던것같습니다. 그냥 공부하다가 이해가 안되서 질문했읍니다..
106.250 형 내가 한 말 약간 틀린 거 같음 그리고 무슨 말인지는 알겠고 이럴 때 신기능을 겸사겸사 배운다고 생각하지 뭐
이게 뭐라고 댓글이 20개씩 달리냐
프갤의훈훈함을 보여주는 글임 - dc App
상구야. 생활코딩이고 클로저고 나발이고 조까고 저 문제 해결법은 심플함. 현재시점의 i를 넘기고 싶으면 setTimeout을 다른 익명함수로 밖에다 감싸서 for문 안에서 불러. 그럼 time duration 문제는 일어나지 않음. 돌아가는 구조 이해도 못하면서 개소리 훈계들 오지네.. 빙빙 돌리면서 헛소리하는건 더 오지고...
넵 새로운익명함수로 감싸고 즉시실행하면서 인자로 i를 넘겨주면 즉시실행함수가 클로저역할을 하면서 해결되는거같아요 ㄱㅅ함니다 - dc App
아 즉시실행함수가 아니라 내부함수가 되어서 아 뭐 아무튼 감사합니다
마이크로 x settimeout api는 매크로 입니다 - dc App
무슨말인지모르곘으니 찾아보고 공부하고 수용하겠읍니다.
const j = var i; 하고 콜백에 j 하면 안됨?
아마 다른 댓을보니까 const 나 let 을 쓰면 쉽게해결되는거같음 . 그게되는진 나도 좆밥이라모름 ㅠ
setTimeout(function(i) { console.log(i); }, i * 1000 , i); 이렇게 하니까 클로저 i가 아니고 for문 당시 i값 평가해서 콜백 블록으로 넘겨줌
mdn에 setTimeout 인자는 2개만받는데 바낀거임?
callback 매개변수 지원이 ie10부터니까 새로 추가된사양인듯
ㄳ합니다