valeur de retour setInterval/setTimeout

deux questions:

  1. comment calcule-t-on la valeur retournée de setInterval et setTimeout (ceux utilisés pour effacer les minuteries)?

  2. est-il possible pour les deux fonctions de retourner la même valeur pendant l'exécution? Par exemple:

    var a = setInterval(fn1, 1000);

    var b = setTimeout(fn2, 1000);

est-il possible pour a et b pour avoir la même valeur?

la première est plus une question de connaissance, mais la seconde est plus importante.

34
demandé sur Salvador Dali 2009-06-02 19:11:37

6 réponses

Renvoie une valeur qui peut être utilisé pour annuler la minuterie. donc, il semble peu probable qu'ils retournent la même valeur (à moins qu'ils ne réutilisent des valeurs et que l'un des timers ait déjà été annulé)

Mozilla unis c'est DOM niveau 0, mais ne faisant pas partie de la spécification. (regardez au bas de la page)

j'ai une meilleure référence:

Nabble dit:

SetTimeout et setInterval sont de la spécification Javascript originale, pré-ECMA. Cette spécification n'est pas officiellement normalisée n'importe où, mais il est supporté par tous les navigateurs web et la plupart des implémentations du Le langage Javascript. (Comprendre ActionScript.)

La pré-spécifications ECMA sont souvent connus comme L'APIs "DOM-0". Depuis qu'ils ont jamais été standardisé auparavant, il faire sens pour HTML5 à enfin spec les IPA Non dépréciés dans une tentative pour fournir un environnement cohérent dans les navigateurs. Surtout quand les événements récents ont prouvé qu'il n'y sont des entreprises qui aiment mettre en œuvre la lettre de la norme, mais pas esprit.

Lire la spécification originale ici , ou de Sun (qui était un des premiers endorseurs de JavaScript).

33
répondu cgp 2010-10-24 07:21:36

testé sous Opera 9, Safari 3, Firefox 3 et IE 7.

toutes les valeurs entières retournées, commençant à 1 et augmentant ensuite de 1 pour chaque appel à setTimeOut() et setInterval() . Cependant, j'ai remarqué que les navigateurs démarraient les compteurs et les manipulaient différemment:

  • IE a commencé avec un nombre (apparemment) aléatoire de 6 chiffres, mais les appels subséquents à l'une ou l'autre fonction incrémenté ce nombre. Après la fermeture et la réouverture IE j' j'ai trouvé que le nombre de départ semblait être généré au hasard, car il n'était pas proche du compte de la session précédente.
  • Opéra maintenu un compteur pour chaque onglet de fermeture d'un onglet et d'en ouvrir un nouveau commencé le compteur de 1 dans le nouvel onglet.
  • dans Safari, le compte était global - ouvrir un nouvel onglet et appeler les fonctions dans différents onglets semblait incrémenter un compteur de référence global.
  • dans Firefox, le compteur apparu pour démarrer à 2, et incrémenté à chaque appel à la fonction. Comme Opera, chaque onglet avait sa propre contre-valeur, mais ils semblaient tous commencer à 2.

notez cependant que dans tous les scénarios, il n'y a pas deux identificateurs (au moins dans le même onglet) qui soient identiques.

31
répondu Alex Rozanski 2009-06-02 15:27:50

je pense que ce n'est pas un comportement standarisé. Dans firefox, c'est juste entier, incrémentant sur chaque appel de setTimeout ou setInterval . Et, non, ils ne peuvent pas avoir la même valeur.

6
répondu Maciej Łebkowski 2009-06-02 15:14:17

à Partir du site web Mozilla:

intervalID est un identifiant d'intervalle unique que vous pouvez passer à clearInterval().

de Sorte qu'il est unique :)

2
répondu Ropstah 2009-06-02 15:13:55

s'ils peuvent avoir la même valeur dépend de L'implémentation JavaScript. Comme Maciej mentionné dans Firefox, ils ne peuvent pas avoir la même valeur que le même compteur. Cependant, cela pourrait être différent dans d'autres navigateurs, il est donc peut-être préférable de ne pas compter sur eux n'ayant jamais la même valeur.

1
répondu Mario Menger 2009-06-02 15:24:40

il me semble que la valeur retournée est la valeur de l'indice pour n'importe quelle liste de minuteries/intervalles maintenue en interne qu'ils gardent.

comme dans point, j'ai appelé clearInterval(18) au lieu de clearInterval(var_returned_from_set) et cela a arrêté le minuteur/intervalle désiré. (Testé FF17.0.1 et IE9.0.8)

également dans mes propres tests, ils semblent être uniques pour la durée de vie de la page pour ces deux navigateurs.

0
répondu Plater 2014-03-05 16:52:27