Différence entre setTimeout (fn, 0) et setTimeout (fn, 1)?

La source jquery utilise les fonctionnalités de setTimeout avec 0 et 1 comme deuxième argument. J'ai l'impression qu'ils signifient tous deux "exécuter la fonction dès que possible".

Est-ce correct? Y a-t-il une différence entre les deux?

Je pense que la réponse est "Cela dépend" maintenant.

Nous pouvons exécuter le code dans différentes plate-formes et navigateurs:

 function setTimeouts() { setTimeout(function() { console.log(2); }, 2); setTimeout(function() { console.log(1); }, 1); setTimeout(function() { console.log(0); }, 0); } for (var i = 0; i < 10; i++) { setTimeouts(); } 

setTimeout a un délai d'attente minimum de 4ms. Il n'y a donc pas de différence entre les deux.

Si la tâche en cours d'exécution est une tâche créée par la méthode setTimeout (), et le délai d'attente est inférieur à 4, augmentez le délai d'attente à 4.

Spec

EDIT: Comme l'a souligné Ahmad dans les commentaires, la spécification a changé maintenant, alors la réponse serait actuellement: "Cela dépend".

Je ne suis pas sûr que les réponses données soient correctes. En exécutant le code suivant dans Chrome, 0 invoque clairement la fonction liée plus rapidement (basculez simplement les valeurs de minuterie entre 0 et 1 ):

 console.log("A"); console.log("B"); var start = new Date().getTime(); setTimeout(function() { console.log(new Date().getTime() - start); }, 0); console.log("C"); console.log("D"); 

0 semble faire quelque chose comme le setImmediate de setImmediate , en poussant une instruction à la fin de la pile d'appels en cours, tandis que 1 invoque tout ce que l'implémentation considère comme une valeur minimale.

Par programmation et par calcul, il y a une différence, mais ce n'est pas une différence que vous verrez lorsque vous l'exécutez, car ce n'est que 1ms .

J'imaginerais que si le délai d'attente est défini sur 1ms , il fait une pause sur ce script et permet d'exécuter d'autres scripts pendant ce temps-là. Et comme vous le savez bien, javascript est simple, ce qui pourrait être votre raison d'être.

MODIFIER:

Merci à @molf qui a corrigé mes pensées, il semblerait que le fait de le configurer à 0 ms ne soit qu'une astuce pour l'exécuter dans la prochaine coche de la boucle de l'événement.

Pour des raisons pour lesquelles setTimeout (fn, 0) ou setTimeout (fn, 1) est nécessaire, vérifiez pourquoi SetTimeout (fn, 0) est-il parfois utile?

Essentiellement, cela signifie que cette méthode n'est pas très urgente à exécuter par rapport à d'autres tâches de navigateur comme le rendu de page. En outre, le code js sera exécuté après que les tâches d'attente sont terminées. Pratiquement sage, il n'y a pas de différence entre l'utilisation de 0 ou 1. Ce n'est que le choix du programmeur. Idéalement, le nombre choisi par les codeurs est inférieur à 4, ce qui peut être dû à la raison soulignée par Amaan.

Btw, pour des informations de base sur les temporisateurs Javascript, consultez http://ejohn.org/blog/how-javascript-timers-work/

C'est simplement un exemple de mauvaise pratique du code dans la source jQuery.

C'est tout. Il n'y a aucune raison de favoriser 0 sur 1 ou vica versa.

Élevez un bug jQuery, faites-le réparer / normaliser pour utiliser l'un ou l'autre.