JavaScript调用堆栈及setTimeout使用方法深入剖析_javascript技巧
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函数调用的灵活性,为函数执行顺序的调度提供极大便利。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La veille est une nouvelle fonctionnalité de la mise à jour iOS 17 qui offre un moyen nouveau et amélioré d'accéder aux informations lorsque votre téléphone est rapidement inactif. Avec StandBy, vous pouvez facilement vérifier l'heure, afficher les événements à venir, parcourir votre calendrier, obtenir des mises à jour météo pour votre emplacement, et bien plus encore. Une fois activé, l’iPhone entrera intuitivement en mode veille lorsqu’il sera réglé en mode paysage pendant le chargement. Cette fonctionnalité est parfaite pour les points de chargement sans fil comme votre table de chevet, ou lorsque vous êtes loin de charger votre iPhone pendant les tâches quotidiennes. Il vous permet de parcourir différents widgets affichés en veille pour accéder à différents ensembles d'informations provenant de diverses applications. Cependant, vous souhaiterez peut-être modifier ces widgets ou même en supprimer certains en fonction de vos préférences et des informations dont vous avez fréquemment besoin. Alors plongeons-nous dans

Veille est un nouveau mode d'écran de verrouillage personnalisable dans iOS 17 qui peut être activé lorsque l'iPhone est en charge et couché sur le côté. Considérez-le comme une sorte d'écran intelligent pour votre iPhone, permettant un accès rapide à différents écrans d'informations consultables qui peuvent être visualisés à distance pendant que votre appareil est en charge dans la cuisine, le bureau ou la table de nuit, par exemple. Le widget de veille personnalisé se compose de trois écrans et est accessible en faisant glisser votre doigt horizontalement sur l'écran de l'iPhone. Le premier écran est l'endroit où se trouvent les widgets interactifs, tandis qu'un balayage vers la gauche révèle les deuxième et troisième écrans, qui affichent respectivement des photos de la galerie de photos et un grand affichage d'horloge. L'écran des widgets se compose de deux piles de widgets interactives affichées côte à côte que vous pouvez faire glisser de haut en bas indépendamment. Ces piles sont comme des piles de widgets sur l'écran d'accueil

La différence entre settimeout et setInterval : 1. Temps de déclenchement, settimeout est unique, il exécute la fonction une fois après avoir défini le temps de retard, tandis que setinterval est répétitif, il exécutera la fonction à plusieurs reprises à l'intervalle de temps défini ; , settimeout n'est exécuté qu'une seule fois et setinterval sera exécuté à plusieurs reprises jusqu'à son annulation.

Golang est un langage de programmation populaire avec un concept de conception unique en programmation simultanée. Dans Golang, la gestion de la pile (heap et stack) est une tâche très importante et est cruciale pour comprendre le mécanisme de fonctionnement du programme Golang. Cet article approfondira les différences entre les piles dans Golang et démontrera les différences et les connexions entre elles à travers des exemples de code concrets. En informatique, les piles sont deux méthodes courantes d'allocation de mémoire. Elles diffèrent par la gestion de la mémoire et le stockage des données.

Les méthodes pour résoudre les exceptions de débordement de pile Java incluent : 1. Modifier la logique du code pour éviter la récursion infinie et les dépendances circulaires ; 2. Augmenter la taille de la pile de la machine virtuelle Java 3. Utiliser l'optimisation de la récursion de queue ; multi-thread. Les exceptions de débordement de pile Java sont généralement causées par des appels récursifs trop profonds ou des dépendances circulaires. Lorsqu'une fonction s'appelle de manière récursive et ne termine pas la récursion à un moment donné, un débordement de pile se produit. En effet, chaque appel de fonction ajoute un nouveau cadre de pile à la pile et si elle est appelée trop de fois, la pile débordera.

La différence entre le tas et la pile est la suivante : 1. La pile est une structure de données linéaire, tandis que le tas est une structure de données arborescente ; 2. La méthode d'allocation de mémoire de la pile est automatique, tandis que l'allocation et la libération de mémoire du tas sont effectuées. nécessite une gestion manuelle ; 3. La vitesse d'allocation de mémoire de la pile est relativement rapide, tandis que la vitesse d'allocation de mémoire du tas est plus lente 4. La taille de la pile est fixe, mais la taille du tas peut être ajustée dynamiquement selon les besoins ; ; 5. La pile convient à la gestion des variables locales, des appels de fonctions et de la récursion, etc., tandis que le tas convient aux données qui doivent être stockées pendant une longue période, aux structures de données dynamiques et aux données volumineuses, etc.

Java utilise la classe StackTraceElement pour suivre les piles d'appels de méthodes Introduction : Dans le développement de logiciels, le débogage est un processus très important, qui peut nous aider à localiser les problèmes et à découvrir la source des erreurs. Pendant le processus de débogage, comprendre la pile d’appels de méthode peut nous aider à trouver le problème plus rapidement. En Java, nous pouvons tracer la pile d'appels de méthode en utilisant la classe StackTraceElement. 1. Introduction à la classe StackTraceElement : Stack

Structures de données PHPSPL : présentation Les structures de données phpSPL sont un composant de la bibliothèque standard PHP (SPL) qui fournit un ensemble de structures de données communes, notamment des piles, des files d'attente, des tableaux et des tables de hachage. Ces structures de données sont optimisées pour gérer efficacement une variété de types de données et fournir une interface cohérente qui simplifie le développement d'applications. Pile de structure de données principale Une pile est une collection ordonnée suivant le principe du dernier entré, premier sorti (LIFO). Dans la pile, le dernier élément ajouté sera le premier élément supprimé. SPL fournit une classe SplStack pour représenter une pile. L'exemple suivant montre comment utiliser SplStack : $stack=newSplStack();$stack->push(1
