suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – Informationen zum Problem mit der Ausführungszeit von setTimeout

A

    for (var i=5; i>=1; i--) { 
          setTimeout( function timer() {
              document.write(i+"<br />");
          }, i*3000 );
    }
    // 0 0 0 0 0
    // 保存执行后,3秒后弹出第一个console(0),之后隔3秒弹出第二个,依次按照时间执行。

A2

    for (var i=1; i<6; i++) { 
          setTimeout( function timer() {
                console.log(i);
          }, i*3000 );
    }
    // 6 6 6 6 6
    // 保存执行后,3秒后弹出第一个console(6),之后每隔3秒弹出一个,依次按照时间执行。

B

    for (var i=5; i>=1; i--) { 
          setTimeout( function timer() {
              document.write(i+"<br />");
          }, 3000 );
    }
    // 0 0 0 0 0 
    // 保存执行后,3秒后所有的console一齐弹出
    

C (mit Verschluss)

    for (var i=5; i>0; i--) { 
          !function (num) {
              setTimeout( function timer() {
                console.log(num);
              }, i*3000 );
          }(i)
    }
   // 1 2 3 4 5 每隔3秒依次弹出

Frage:

1. Werden die Werte in den Zeiteinstellungen in A und A2i*3000i值为多少?(1?),为什么时间依旧是3000,没有和i zusammengerechnet? Auch nach der Verwendung von Schließung (C) wird es immer noch alle 3000 ms angezeigt.

2. Was ist der Unterschied zwischen A und B? i*30003000consoleDer Unterschied beim Pop-up, Dieser Unterschied spiegelt sich auch im C-Verschluss wider. Warum gibt es so einen Unterschied?

Ich habe die Warteschlangenausführungsstruktur von JS schon einmal gesehen und weiß, dass Funktionen wie setTimeout auf die Ausführung anderer Codes warten müssen, bevor sie mit der Ausführung beginnen. Wenn es mehrere setTimeouts gibt, wird die Priorität entsprechend der Zeitdauer zugewiesen Abbinden (die Abbindezeit ist zunächst kürzer). Ich weiß wirklich nicht, warum es so einen Unterschied gibt, und ich kann es immer noch nicht herausfinden - -

for (var i=1;i<6;i++) { 
      !function (num) {
          setTimeout( function timer() {
            console.log(num);
          }, num*3000 );
      }(i)
}

Es erscheint immer noch alle 3 Sekunden. console,去掉num*Dann erscheint es auf einmal. Wird die Multiplikationsoperation nicht durchgeführt?

滿天的星座滿天的星座2805 Tage vor841

Antworte allen(2)Ich werde antworten

  • 欧阳克

    欧阳克2017-06-14 10:56:39

    1. setTimeout每隔3000ms弹出一个的话,时间不应该是3000,6000,9000,12000吗,你是不是跟setInterval搞混了。
      然后再说一点setTimeout(fn,time),这是个函数的执行,setTimeout的创建与主js是同步的(这个时候time的值就已经确定了),异步的是其中的fn的执行(执行的时候再去找内部的i或者num才会收闭包等的影响)。

    2. 站内搜一下event loop js应该有很多重复的问题和解释。

    Antwort
    0
  • ringa_lee

    ringa_lee2017-06-14 10:56:39

    setTimeout的延迟是相对于你运行它的那一刻,你这个for循环一股脑的把延迟全部设定好了,第一个相对当前3秒,第二个相对当前是6秒,第三个是9秒……以此类推。最后体现出来不就是每隔3秒一个输出吗……

    Antwort
    0
  • StornierenAntwort