for(var i=1;i<5;i++){ setTimeout(function(){console.log(i)},i*1000); } Ici, la boucle for est terminée en premier puis i Le la valeur est devenue 5 Ensuite, la boucle for est exécutée en premier, alors pourquoi i*1000 est-il exécuté ?
Lorsque la boucle for est exécutée, cela équivaut à écrire 4 fonctions de minuterie sur la page. À ce moment, la fonction de minuterie n'a pas encore été exécutée et la valeur de la variable i dans le global est 5 lorsque l'heure de la minuterie est atteinte. est activé, les fonctions de minuterie sont exécutées en séquence. Imprimez 4 à 5 en séquence.
Cet exemple n'est pas une fermeture. La fermeture doit être écrite comme ceci, ce qui équivaut à écrire quatre fonctions immédiatement exécutées sur la page. Les paramètres réels reçus par ces quatre fonctions sont 1, 2, 3 et 4 dans l'ordre. Selon les caractéristiques de fermeture : lorsque la minuterie se termine, la fonction minuterie peut accéder aux paramètres réels reçus par sa fonction externe, elle imprimera donc 1, 2, 3, 4 dans l'ordre
Dans l'ordinateur, toute variable doit ouvrir un espace dans la mémoire pour être stockée, et elles ont ensuite toutes une adresse. Si vous avez étudié le langage C ou le langage assembleur, vous devriez mieux le savoir.
Parlons d'abord de la raison pour laquelle j'en génère 5 à chaque fois. Parce que l'espace de i (c'est-à-dire l'espace mémoire utilisé pour stocker i, scientifiquement appelé "pile") a été modifié cinq fois, et lorsque la fonction anonyme est exécutée, l'espace de i en stocke 5.
Expliquons pourquoi le deuxième paramètre est différent à chaque fois. i*1000并没有修改i的值,而是会产生一个结果。那么这个结果必然要找地方去存。存储在哪呢?setTimeout每被调用一次,都会开辟一段内存空间,其中一部分空间就用于存储它的两个参数。其中一个参数就是刚才i*1000产生的结果。而setTimeout被调用了5次,于是存储了5个结果!没错,是在5个不同的空间存储了5个结果,而不是像i Le même espace a été modifié 5 fois ! Comme vous pouvez l’imaginer, cette approche est très gourmande en mémoire.
Lorsque la fonction for entre dans le thread principal, chaque setTimeout entre à son tour dans la file d'attente de la file d'attente des tâches. Une fois le for exécuté, le setTimeout dans la file d'attente des tâches entre dans le thread principal pour l'exécution. Sans fermeture, i vaut déjà 5 lorsque setTimeout est exécuté ; avec une fermeture, la valeur de i sera enregistrée lorsque setTimeout entrera dans la file d'attente des tâches. Pour plus de détails, voir : Boucle d'événement
Lorsque la boucle for est exécutée, cela équivaut à écrire 4 fonctions de minuterie sur la page. À ce moment, la fonction de minuterie n'a pas encore été exécutée et la valeur de la variable i dans le global est 5 lorsque l'heure de la minuterie est atteinte. est activé, les fonctions de minuterie sont exécutées en séquence. Imprimez 4 à 5 en séquence.
Cet exemple n'est pas une fermeture. La fermeture doit être écrite comme ceci, ce qui équivaut à écrire quatre fonctions immédiatement exécutées sur la page. Les paramètres réels reçus par ces quatre fonctions sont 1, 2, 3 et 4 dans l'ordre. Selon les caractéristiques de fermeture : lorsque la minuterie se termine, la fonction minuterie peut accéder aux paramètres réels reçus par sa fonction externe, elle imprimera donc 1, 2, 3, 4 dans l'ordre
Dans l'ordinateur, toute variable doit ouvrir un espace dans la mémoire pour être stockée, et elles ont ensuite toutes une adresse. Si vous avez étudié le langage C ou le langage assembleur, vous devriez mieux le savoir.
Parlons d'abord de la raison pour laquelle j'en génère 5 à chaque fois. Parce que l'espace de i (c'est-à-dire l'espace mémoire utilisé pour stocker i, scientifiquement appelé "pile") a été modifié cinq fois, et lorsque la fonction anonyme est exécutée, l'espace de i en stocke 5.
Expliquons pourquoi le deuxième paramètre est différent à chaque fois.
i*1000
并没有修改i
的值,而是会产生一个结果。那么这个结果必然要找地方去存。存储在哪呢?setTimeout
每被调用一次,都会开辟一段内存空间,其中一部分空间就用于存储它的两个参数。其中一个参数就是刚才i*1000
产生的结果。而setTimeout
被调用了5次,于是存储了5个结果!没错,是在5个不同的空间存储了5个结果,而不是像i
Le même espace a été modifié 5 fois ! Comme vous pouvez l’imaginer, cette approche est très gourmande en mémoire.Comprenez-vous cette explication ?
Lorsque la fonction for entre dans le thread principal, chaque setTimeout entre à son tour dans la file d'attente de la file d'attente des tâches. Une fois le for exécuté, le setTimeout dans la file d'attente des tâches entre dans le thread principal pour l'exécution. Sans fermeture, i vaut déjà 5 lorsque setTimeout est exécuté ; avec une fermeture, la valeur de i sera enregistrée lorsque setTimeout entrera dans la file d'attente des tâches.
Pour plus de détails, voir : Boucle d'événement