La temporisation d'exécution différente des fonctions JS affectera les résultats de sortie de l'opération de fonction. Vous ne pouvez pas juger ce que la fonction génère par le code lui-même, mais en fonction de la temporisation d'exécution spécifique de la fonction.
1 Voir le code ci-dessous
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
La sortie d'exécution de code ci-dessus 6 6s, pourquoi? Étant donné que setTimeout est une tâche asynchrone, l'opération effectuée ici sera lancée dans une autre file d'attente de tâches par le navigateur. Le navigateur continuera à s'exécuter à ce moment et le code suivant sera exécuté avant l'exécution de la fonction setTimeout. Opération, cette fois parce que la boucle for a ajouté i à 6, donc toute la sortie est 6.
2 Comment faire imprimer le code ci-dessus 0, 1, 2, 3, 4, 5?
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
Définissez i dans le corps de la boucle for, et la sortie est le résultat que nous voulons. Pourquoi?
Étant donné que la portée de la variable let ne peut être que dans la fonction actuelle, chaque fois que la boucle for génère un nouveau i, la sortie i dans setTimeout est le nouveau i, et ce i ne changera pas, donc la sortie est Normal.
3 Outre l'utilisation de let, il existe d'autres façons d'imprimer 0, 1, 2, 3, 4, 5
3.1 En utilisant les fermetures de fonctions, nous définissons une fonction anonyme et passons le courant i comme valeur dans la sortie, vous pouvez imprimer le résultat correct
let i
for(i = 0; i<6; i++){
!function(value) {
setTimeout(()=>{
console.log(value)
},0)
}(i)
}
3.2 Utilisez le troisième paramètre de setTimeout, passez i dedans et imprimez-le comme valeur
let i
for(i = 0; i<6; i++){
setTimeout((value)=>{
console.log(value)
},0,i)
}
3.3 Utilisation du mot clé const
let i
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}