javascript - Mengenai isu masa pelaksanaan setTimeout
滿天的星座
滿天的星座 2017-06-14 10:54:39
0
2
819

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 (menggunakan penutupan)

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

Soalan:

1. Adakah nilai dalam tetapan masa dalam A dan A2i*3000i值为多少?(1?),为什么时间依旧是3000,没有和i dikira bersama? Termasuk selepas menggunakan penutupan (C), ia masih muncul setiap 3000ms.

2. Apakah perbezaan antara A dan B? i*30003000consolePerbezaan dalam pop timbul, Perbezaan ini juga ditunjukkan dalam penutupan C. Mengapa terdapat perbezaan sedemikian?

Saya telah melihat struktur pelaksanaan baris gilir JS sebelum ini, dan saya tahu bahawa fungsi seperti setTimeout mesti menunggu kod lain dilaksanakan sebelum memulakan pelaksanaan Jika terdapat berbilang setTimeout, keutamaan akan diberikan mengikut tempoh masa tetapan (masa penetapan lebih pendek dahulu) . Saya benar-benar tidak tahu mengapa terdapat perbezaan sedemikian, dan saya masih tidak dapat memahaminya - -

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

Ia masih muncul setiap 3 saatconsole,去掉num*kemudian ia muncul serentak. Bukankah operasi darab dilakukan?

滿天的星座
滿天的星座

membalas semua(2)
学霸
  1. setTimeout每隔3000ms弹出一个的话,时间不应该是3000,6000,9000,12000吗,你是不是跟setInterval搞混了。
    然后再说一点setTimeout(fn,time),这是个函数的执行,setTimeout的创建与主js是同步的(这个时候time的值就已经确定了),异步的是其中的fn的执行(执行的时候再去找内部的i或者num akan mengurangkan kesan penutupan, dsb.).

  2. Jika anda mencari acara loop js di tapak, mesti ada banyak soalan dan penjelasan berulang.

左手右手慢动作

setTimeout的延迟是相对于你运行它的那一刻,你这个forGelung dan tetapkan semua kelewatan sekali gus Yang pertama ialah 3 saat berbanding masa semasa, yang kedua ialah 6 saat berbanding masa semasa, yang ketiga ialah 9 saat berbanding masa semasa... dan seterusnya. Akhirnya, bukankah ia tercermin dalam output setiap 3 saat...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan