• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

12장 주변 칸 한번에 열기 부분에 질문드립니다.

22.03.06 19:55 작성 조회수 129

0

안녕하세요 제로초님,

12장 지뢰게임 중 주변칸 한번에 열기를 구현하는 부분의 코드에 대해 몇가지 질문드립니다.

openAround와 open으로 함수를 나누지 않고 우선 한 군데에 모두 작성해보았는데요

 

질문1.

사용자가 선택한 태그를 찾는 target을 그냥 event.target으로 하지 않은 이유는 인자로 event를 받아오지 않기때문인가요~?

그냥 event.target으로 해도 작동이 되긴하는데 다른 방법으로 사용해야하는 유의할 사항이 있는 지 궁금합니다.

 

질문2.

상단 if문 중 이미 열린 칸 클릭을 막는 것 외에 if(!target){return} 이 필요한 이유는

setTimeout 안의 코드로 실행되는 지정된 태그가 게임판 외부의 undefiend이 선택될 수 때문이 맞을까요?

 

질문3.

1개의 함수내에 칸이 열리는 코드를 작성하다보니 setTimeout을 if문으로 감싸 if문 조건에 만족하지 않으면 setTimeout 자체가 실행되지 않는 것으로 하였습니다.

이 부분에서 분리할 수 있다면 최대한 함수를 분리하는게 나은지(openAround와 open로)와

setTimeout이 조건에 따라 실행된다면 setTimeout을 호출하더라도 조건에 맞지 않아 실행되지 않는 방법과 조건에 맞지 않는다면 애초에 호출조차 되지 않는 방법 중 감싸는 순서가 작동 효율성(?)에 영향을 미치는 지 궁금합니다. 

답변 1

답변을 작성해보세요.

0

1. event.target이 될 수가 없습니다. event라는게 상위 스코프에 존재하지 않아서요. 혹시 openAround를 onLeftClick 안에 넣으신건가요?

2. 네네 혹시나 존재하지 않는 칸을 선택했을까봐 그랬던 겁니다.

3. 코드가 길어지면 길어질수록 분리하는 게 낫습니다. if문은 바깥에 있는 게 낫습니다. 그래야 쓸데없는 setTimeout이 호출되지 않습니다.

늦은 시간에 답변 감사합니다!

1. 넵 맞습니다. onLeftClick 안에서 호출하였습니다. 클릭 이벤트에 의해 실행되는 함수안에서 호출되었기때문에 event.target이 적용된 것일까요~?

여러 경우에 대입해서 테스트해보았는데 event.target이 그냥 적용되어서 스코프에 따른 사용 가능 유무가 확인이 되지 않습니다 ㅠㅠ

1. 네 onLeftClick에 event 매개변수가 있으니까요. openRound를 바깥으로 빼보세요.

제로초님 이리저리 빼봐도 오류가 나지 않아 깃허브에 올려주신 코드와 비교해서 다른점을 찾았는데요..!

상단 코드는 위에 제가 질문드린 3번과 같이 if문으로 감싼 것이고 하단은 setTimeout을 먼저 호출하는 코드입니다. 상단 코드에서는 event.target을 사용해도 오류가 생기지 않지만, 하단 코드에서는 오류가 생겨 사용할 수 없습니다.

이 문제가 맞다면 setTimeout의 특징인 것인지 함수 안에 함수를 호출해서 생기는 차이인지 궁금합니다..!

event.target을 어떻게 쓰신 건지 open과 onLeftClick이 다 나오는 전체 코드를 보여주셔야할 것 같습니다.

open함수 내에 target을 event.target으로 바꾸어 테스트하였고,

openAround함수 내 const count = open(rowIndex, cellIndex)가 setTimeout 안으로 들어가는 지, 밖에 나오는 지에 따라 오류 유무가 나뉘는 것 같습니다.

setTimeout 내부로 들어오면 2번째 스크린샷 오류가 발생합니다..!