J'ai travaillé avec la fonction asynchrone setTimeout en javascript. Le code suivant donne des résultats différents lorsque le paramètre est passé dans une fonction setTimeout et pas dans une autre. Quelqu'un peut-il expliquer cela?
Code 1:
Before After undefined
Sortie 1:
console.log("Before"); getUserId(2); console.log("After"); function getUserId(id){ setTimeout((id) =>{ console.log(id); }, 2000); }
et,
Code 2:
Before After 2
Sortie 2:
console.log("Before"); getUserId(2); console.log("After"); function getUserId(id){ setTimeout(() =>{ console.log(id); }, 2000); }
4 Réponses :
Parce que dans l'exemple 1, l'id est défini dans la portée de getUserId (id) Dans l'exemple 2, l'identifiant est à nouveau défini dans cette étendue, mais un deuxième identifiant à portée plus étroite a été créé via votre fonction anonyme. il n'est pas nécessaire de passer à setTimeout () le paramètre id car il existe déjà dans la portée getUserId
Si vous voulez passer des paramètres à votre callback
, vous pouvez les mettre après le paramètre delay
. Si vous ne transmettez aucun paramètre, votre rappel est appelé sans
console.log("Before"); getUserId(2); console.log("After"); function getUserId(id){ setTimeout((id) =>{ console.log(id); }, 100, id); }
setTimeout(function[, delay, param1, param2, ...]);
Dans le deuxième exemple, vous redéfinissez la portée de la variable id
dans le rappel passé à setTimeout ()
. En d'autres termes, cela revient à:
function getUserId(id){ setTimeout((some_other_id) => { console.log(some_other_id); // some_other_id is undefined }, 2000); }
Comprendre la portée de id
expliquera / résoudra votre problème.
Le paramètre id à l'intérieur du rappel setTimeout sera indéfini sauf si vous lui attribuez une valeur par défaut comme dans l'exemple
function parentMethod(parentId) { setTimeout((id = parentId) => { console.log(id); }, 2000); }
Vérifiez cette ligne
setTimeout ((id = parentId) => {
Ici, je lui attribue une valeur par défaut, donc il enregistrera tout ce que j'attribue à la méthode parente.
Double possible de Comment puis-je passer un paramètre à un setTimeout () rappel?
Votre nom d'id est le même dans la méthode de rappel pour setTimeout et la fonction getUserId est probablement ce qui vous déroute dans le deuxième exemple, ce sont 2 variables de portée différente, et vous n'envoyez pas de valeur lorsque le rappel setTimout est appelé. Dans votre premier exemple, l'identifiant est capturé par une fermeture.