setTimeout 문제 탐색

3105 단어 자바 script
문제.
이전에 비동기 문 제 를 언급 했 는데 다음 코드 는 무엇 을 출력 합 니까?
for(var i = 0;i<10;i++){
  setTimeout(function(){
    console.log(i);  
  },1000);
}

이것 은 내 가 최근 에 만난 주제 다.그 때 는 몰 랐 습 니 다.그러나 나중에 면접 관 이 나 에 게 setTimeout 은 비동기 적 으로 집행 된다 고 말 했다.그리고 답 을 알려 줬 어 요.나중에 군중 속 에서 토론 하면 서 알 게 되 었 다.10 개 를 출력 합 니 다.
탐색 하 다.
왜 일 까요?우선 setTimeout 은 비동기 로 실 행 됩 니 다.그래서 setTimeout 이 실행 되 기 전에 전역 변수 i 는 이미 10 이 되 었 다.
그럼 어떻게 해결 하면 0 - 9 를 출력 할 수 있 을까요?사실 해결 해 야 할 것 은 i 를 사용 할 때 i 의 가 치 를 보장 하 는 것 이 우리 가 그 당시 에 원 했 던 그 가치 이다.
만약 호환성 을 고려 하지 않 는 다 면, 우 리 는 es6 의 let 를 사용 하여 모든 i 를 국부 변수 로 바 꿀 수 있다.코드 는 다음 과 같 습 니 다:
for(let i = 0;i<10;i++){
  setTimeout(function(){
    console.log(i);  
  },1000);
}

호환성 을 고려 하려 면 익명 함수 로 i 를 매개 변수 로 전송 합 니 다. 그러면 우리 가 사용 하 는 i 는 부분 변수 입 니 다.외부의 영향 을 받 지 않 을 것 이다.코드 는 다음 과 같 습 니 다:
for(var i = 0;i<10;i++){
  (function(i){
    setTimeout(function(){
      console.log(i);  
    },1000);
  })(i)
}

promise 를 사용 하면 다음 과 같은 방법 을 사용 할 수 있 습 니 다.
for(var i = 0;i<10;i++){
  let a = i;
  let p = new Promise((resolve,reject)=>{
    setTimeout(()=>{resolve(a)},1000);
  });
  p.then(i=>console.log(i))
}

사고 하 다.
이런 promise 방법 이 더 귀 찮 았 나 봐 요.하지만 더 복잡 한 수요 에 적용 됐다.setTimeout 의 시간 이 난수 라 고 가정 합 니 다.우 리 는 모든 숫자 를 인쇄 한 후에 조작 을 해 야 한다. 그러면 어떻게 해 야 합 니까?구체 적 으로 참고 할 수 있다. https://segmentfault.com/a/11...
실행 효율 상의 고려:
console.time('a');
for(let i = 0;i<10;i++){
  setTimeout(function(){
    console.log(i);  
  },1000);
}
console.timeEnd('a');
console.time('b');
for(var i = 0;i<10;i++){
  (function(i){
    setTimeout(function(){
      console.log(i);  
    },1000);
  })(i)
}
console.timeEnd('b');
console.time('c');
for(var i = 0;i<10;i++){
  let a = i;
  let p = new Promise((resolve,reject)=>{
    setTimeout(()=>{resolve(a)},1000);
  });
  p.then(i=>console.log(i))
}
console.timeEnd('c');

효율 적 으로 현재 새 chrome 의 실행 결 과 는 다음 과 같 습 니 다.
a: 0.35009765625ms
b: 0.348876953125ms
c: 0.880126953125ms

주의: 시스템 에 따라 환경 에 따라 실행 결과 가 다 를 수 있 습 니 다.그 러 니까 가끔 극단 적 인 손님 이 놀 면 돼. 진지 하면 지 는 거 야 -... -
총결산
이전에 나 는 물건 을 만 들 수 있 으 면 된다 고 고 고 집 스 럽 게 생각 했다.기초 가 중요 하지 않다.그래서 나 는 항상 물건 을 만 드 는 단계 에 머 물 렀 다.그러나 나중에 거꾸로 생각 했다. 만약 당신 이 차 를 사고 싶다 면 자동차 파라미터 에 익숙 한 판매원 을 선택 하 시 겠 습 니까? 아니면 어떤 질문 을 하 시 겠 습 니까?답 은 긍정 적 이다.그 러 니까 회사 에서 사람 을 구 하 는 것 도 마찬가지 일 거 예요.
그런데 이 문제 들 이 정말 쓸모 가 있 을 까?맞아요. 저 는 많은 질문 을 잘 대답 하지 못 했 습 니 다. 만약 에 좋 은 면접 을 준비 하기 위해 서 라면 저 는 특별히 몇 군데 더 뛰 어서 문제 가 있 는 면접 문 제 를 모두 정리 할 수 있 습 니 다.아 닙 니 다. 다시 알 아 보 겠 습 니 다. 뒤 척 이 며 물 어 볼 기초 도 별로 없 겠 죠?미 공 을 찾 는 것 처럼 그림 을 자 를 줄 아 세 요? 라 고 물 었 다.조금 만 시간 을 들 여도 배 울 수 있 는 문제 들.개인 적 으로 큰 의미 가 없다 고 생각 합 니 다.
(본 고 는 자신의 블 로 그 를 발췌 했다. http://79px.com/blog/57cd347b...

좋은 웹페이지 즐겨찾기