Rumah hujung hadapan web tutorial js JavaScript调用堆栈及setTimeout使用方法深入剖析_javascript技巧

JavaScript调用堆栈及setTimeout使用方法深入剖析_javascript技巧

May 16, 2016 pm 05:41 PM
settimeout timbunan

Javascript中会经常用到setTimeout来推迟一个函数的执行,如:

复制代码 代码如下:

setTimeout(function(){alert("Hello World");},1000);

会在执行到这句话后延迟1秒钟来弹出alert窗口。那么再看这一段:
复制代码 代码如下:

function a(){
setTimeout(function() {alert(1)}, 0);
alert(2);
}
a();

注意这段代码中的setTimeout延迟设为了0,就是延迟0毫秒,貌似是不做任何延迟立刻执行,即1,2。但实际的执行结果确是2,1。为什么?这得从Javascript调用堆栈(call stack)和setTimeout的功能说起。

首先,JavaScript是单线程的,即同一时间只执行一条代码,所以每一个JavaScript代码执行块会“阻塞”其它异步事件的执行。其次,和其他的编程语言一样,Javascript中的函数调用也是通过堆栈实现的。在执行函数a的时候,a先入栈,如果不给alert(1)加setTimeout,那么alert(1)第2个入栈,最后是alert(2)。但现在给alert(1)加上setTimeout后,alert(1)就被加入到了一个新的堆栈中等待,并“尽可能快”的执行。这个尽可能快就是指在a的堆栈完成后就立刻执行,因此实际的执行结果就是先alert(2),再alert(1)。在这里setTimeout实际上是让alert(1)脱离了当前函数调用堆栈。看下面一个例子:
复制代码 代码如下:



这样一段函数意图是每输入一个字符就把当前input里的所有字符都alert出来,但实际效果确是alert出按键之前的内容。这里,我们就可以利用setTimeout(0)来实现。
复制代码 代码如下:



这样当onkeydown事件触发的时候,alert就被放入了下一个调用堆栈,一旦onkeydown事件触发的堆栈关闭后就开始执行。当然浏览器还有个onkeyup事件也可以实现我们的需求。

这样的setTimeout用法在实际项目中还是会时常遇到。比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何改变而忽略这两句话,因此我们可以通过setTimeout把“设回白色”函数加入下一个堆栈,那么就可以确保背景颜色发生过改变了(虽然速度很快可能无法被察觉)。

总之,setTimeout增加了Javascript函数调用的灵活性,为函数执行顺序的调度提供极大便利。
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menyesuaikan dan mengedit mod siap sedia pada iPhone: Perkara baharu dalam iOS 17 Cara menyesuaikan dan mengedit mod siap sedia pada iPhone: Perkara baharu dalam iOS 17 Sep 21, 2023 pm 04:01 PM

Siap sedia ialah ciri baharu dalam kemas kini iOS 17 yang menyediakan cara baharu dan dipertingkat untuk mengakses maklumat apabila telefon anda melahu dengan cepat. Dengan StandBy, anda boleh menyemak masa dengan mudah, melihat acara akan datang, menyemak imbas kalendar anda, mendapatkan kemas kini cuaca untuk lokasi anda dan banyak lagi. Setelah diaktifkan, iPhone secara intuitif akan memasuki mod siap sedia apabila ditetapkan kepada landskap semasa mengecas. Ciri ini sesuai untuk titik pengecasan wayarles seperti meja malam anda, atau apabila anda berada jauh dari pengecasan iPhone anda semasa tugasan harian. Ia membolehkan anda meleret melalui pelbagai widget yang dipaparkan dalam bersedia untuk mengakses set maklumat yang berbeza daripada pelbagai aplikasi. Walau bagaimanapun, anda mungkin ingin mengubah suai widget ini atau memadam beberapa berdasarkan keutamaan anda dan maklumat yang anda perlukan dengan kerap. Jadi mari kita selami

iOS 17: Cara menyesuaikan widget dalam mod siap sedia iOS 17: Cara menyesuaikan widget dalam mod siap sedia Sep 17, 2023 pm 01:57 PM

Siap sedia ialah mod skrin kunci yang boleh disesuaikan baharu dalam iOS 17 yang boleh diaktifkan apabila iPhone sedang mengecas dan berbaring di sisinya. Fikirkannya sebagai sejenis paparan pintar untuk iPhone anda, yang membenarkan akses pantas kepada skrin maklumat boleh semak imbas berbeza yang boleh dilihat dari jauh semasa peranti anda sedang mengecas di dapur, meja atau meja malam, contohnya. Widget siap sedia tersuai terdiri daripada tiga skrin dan boleh diakses dengan meleret secara mendatar pada paparan iPhone. Skrin pertama ialah tempat widget interaktif terletak, sambil meleret ke kiri mendedahkan skrin kedua dan ketiga, masing-masing menunjukkan foto dari galeri foto dan paparan jam besar. Skrin widget terdiri daripada dua susunan widget interaktif yang dipaparkan bersebelahan yang boleh anda leret ke atas dan ke bawah secara berasingan. Tindanan ini seperti susunan widget skrin utama

Apakah perbezaan antara settimeout dan setinterval Apakah perbezaan antara settimeout dan setinterval Aug 15, 2023 pm 02:06 PM

Perbezaan antara settimeout dan setInterval: 1. Masa pencetus, settimeout adalah satu masa, ia melaksanakan fungsi sekali selepas menetapkan masa tunda, manakala setinterval adalah berulang, ia akan melaksanakan fungsi berulang kali pada selang masa yang ditetapkan , settimeout hanya dilaksanakan sekali, dan setinterval akan dilaksanakan berulang kali sehingga dibatalkan.

Menyelam mendalam tentang perbezaan tindanan di Golang Menyelam mendalam tentang perbezaan tindanan di Golang Mar 13, 2024 pm 05:15 PM

Golang ialah bahasa pengaturcaraan yang popular dengan konsep reka bentuk yang unik dalam pengaturcaraan serentak. Di Golang, pengurusan timbunan (timbunan dan timbunan) adalah tugas yang sangat penting dan penting untuk memahami mekanisme pengendalian program Golang. Artikel ini akan menyelidiki perbezaan tindanan di Golang dan menunjukkan perbezaan serta perkaitan antaranya melalui contoh kod konkrit. Dalam sains komputer, tindanan adalah dua cara biasa untuk memperuntukkan memori. Ia berbeza dalam pengurusan memori dan penyimpanan data.

Bagaimana untuk menyelesaikan pengecualian limpahan timbunan Java Bagaimana untuk menyelesaikan pengecualian limpahan timbunan Java Nov 13, 2023 am 09:35 AM

Kaedah untuk menyelesaikan pengecualian limpahan timbunan Java termasuk: 1. Ubah suai logik kod untuk mengelakkan rekursi tak terhingga dan kebergantungan bulat 2. Meningkatkan saiz timbunan mesin maya Java 3. Gunakan pengoptimuman rekursi ekor 5. Gunakan; berbilang benang . Pengecualian limpahan tindanan Java biasanya disebabkan oleh panggilan rekursif yang terlalu dalam atau kebergantungan bulat Apabila fungsi memanggil dirinya secara rekursif dan tidak menamatkan rekursi pada titik tertentu, limpahan tindanan berlaku. Ini kerana setiap panggilan fungsi menambah bingkai tindanan baharu pada tindanan, dan jika dipanggil terlalu banyak kali, tindanan akan melimpah.

Apakah perbezaan antara timbunan dan timbunan Apakah perbezaan antara timbunan dan timbunan Aug 10, 2023 am 10:12 AM

Perbezaan antara timbunan dan timbunan ialah: 1. Timbunan adalah struktur data linear, manakala timbunan adalah struktur data seperti pokok 2. Kaedah peruntukan memori timbunan adalah automatik, manakala peruntukan memori dan pelepasan timbunan memerlukan pengurusan manual ; 3. Kelajuan peruntukan memori timbunan adalah agak cepat, manakala kelajuan peruntukan memori timbunan adalah lebih perlahan 4. Saiz timbunan adalah tetap, tetapi saiz timbunan boleh dilaraskan secara dinamik mengikut keperluan; ; 5. Timbunan sesuai untuk mengurus pembolehubah tempatan , panggilan fungsi dan rekursi, dsb., manakala timbunan sesuai untuk data yang perlu disimpan untuk masa yang lama, struktur data dinamik dan data besar, dsb.

Java menggunakan kelas StackTraceElement untuk menjejak susunan panggilan kaedah Java menggunakan kelas StackTraceElement untuk menjejak susunan panggilan kaedah Jul 25, 2023 pm 03:21 PM

Java menggunakan kelas StackTraceElement untuk menjejak susunan panggilan kaedah Pengenalan: Dalam pembangunan perisian, penyahpepijatan ialah proses yang sangat penting, yang boleh membantu kami mencari masalah dan mengetahui punca ralat. Semasa proses penyahpepijatan, memahami timbunan panggilan kaedah boleh membantu kami mencari masalah dengan lebih cepat. Di Java, kita boleh mengesan susunan panggilan kaedah dengan menggunakan kelas StackTraceElement. 1. Pengenalan kepada kelas StackTraceElement: Stack

Struktur data PHP SPL: kit alat untuk memberikan kod anda rupa baharu Struktur data PHP SPL: kit alat untuk memberikan kod anda rupa baharu Feb 19, 2024 pm 12:09 PM

Struktur Data PHPSPL: Gambaran Keseluruhan Struktur data phpSPL ialah komponen Perpustakaan Standard PHP (SPL) yang menyediakan satu set struktur data biasa, termasuk tindanan, baris gilir, tatasusunan dan jadual cincang. Struktur data ini dioptimumkan untuk mengendalikan pelbagai jenis data dengan cekap dan menyediakan antara muka yang konsisten yang memudahkan pembangunan aplikasi. Timbunan Struktur Data Utama Timbunan ialah koleksi tersusun mengikut prinsip lepas masuk dahulu (LIFO). Dalam timbunan, elemen terakhir yang ditambahkan akan menjadi elemen pertama yang dialih keluar. SPL menyediakan kelas SplStack untuk mewakili tindanan. Contoh berikut menunjukkan cara menggunakan SplStack: $stack=newSplStack();$stack->push(1

See all articles