2
votes

Lorsqu'elle est appelée dans une fonction avec des paramètres transmis par le parent, pourquoi la journalisation de la fonction setTimeout n'est-elle pas définie?

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);
}


2 commentaires

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.


4 Réponses :


0
votes

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


0 commentaires

1
votes

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, ...]);


0 commentaires

0
votes

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.


0 commentaires

1
votes

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.


0 commentaires