javascript - À propos du problème de temps d'exécution de setTimeout
滿天的星座
滿天的星座 2017-06-14 10:54:39
0
2
825

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 (en utilisant la fermeture)

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

Question :

1. Les valeurs dans les paramètres de temps dans A et A2i*3000i值为多少?(1?),为什么时间依旧是3000,没有和i sont-elles calculées ensemble ? Y compris après avoir utilisé la fermeture (C), elle apparaît toujours toutes les 3 000 ms.

2. Quelle est la différence entre A et B ? i*30003000consoleLa différence dans le pop-up, Cette différence se reflète également dans la fermeture C. Pourquoi y a-t-il une telle différence ?

J'ai déjà vu la structure d'exécution de file d'attente de JS et je sais que des fonctions telles que setTimeout doivent attendre que d'autres codes soient exécutés avant de commencer l'exécution. S'il y a plusieurs setTimeouts, la priorité sera attribuée en fonction de la durée. réglage (le temps de prise est d'abord plus court) . Je ne sais vraiment pas pourquoi il y a une telle différence, et je n'arrive toujours pas à la comprendre - -

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

Il apparaît toujours toutes les 3 secondesconsole,去掉num*puis il apparaît d'un seul coup. L'opération de multiplication n'est-elle pas effectuée ?

滿天的星座
滿天的星座

répondre à tous(2)
学霸
  1. setTimeout每隔3000ms弹出一个的话,时间不应该是3000,6000,9000,12000吗,你是不是跟setInterval搞混了。
    然后再说一点setTimeout(fn,time),这是个函数的执行,setTimeout的创建与主js是同步的(这个时候time的值就已经确定了),异步的是其中的fn的执行(执行的时候再去找内部的i或者num réduira l'impact des fermetures, etc.).

  2. Si vous recherchez event loop js sur le site, il devrait y avoir de nombreuses questions et explications répétées.

左手右手慢动作

setTimeout的延迟是相对于你运行它的那一刻,你这个forBouclez et réglez tous les retards en une seule fois. Le premier est de 3 secondes par rapport à l'heure actuelle, le deuxième est de 6 secondes par rapport à l'heure actuelle, le troisième est de 9 secondes par rapport à l'heure actuelle... et ainsi de suite. Au final, cela ne se traduit-il pas par une sortie toutes les 3 secondes...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal