Maison > Questions et réponses > le corps du texte
Dans le code ci-dessous, un nouveau contexte d'exécution est-il créé pour chaque élément du tableau, ou le contexte d'exécution reste-t-il le même et seul l'enregistrement d'environnement de l'environnement lexical est-il mis à jour ?
Le code ne génère pas d'erreur, donc je suppose que la nouvelle portée (environnement lexical) est créée indépendamment du contexte d'exécution, mais je ne suis pas sûr d'avoir raison.
const nums = [1, 2, 3] nums.forEach(num => { const foo = num })
P粉6748763852024-04-02 23:22:53
Il n'y a rien de spécial dans les rappels fournis aux fonctions standard de la bibliothèque. Ce sont toujours des fonctions et sont toujours appelées de la manière habituelle d'appeler des fonctions.
Oui. Chaque fois que vous appelez une fonction (dans ce cas, lorsque forEach
appelle son rappel), un nouveau contexte d'exécution est créé.
(dans ce cas) n'est pas distinct de la création d'un nouveau contexte d'exécution, non. Dans le cadre de la procédure standard d’appel de fonctions.
En revanche, considérons une boucle for-of
:
for (const num of nums) { const foo = num }
Il n'y a pas de fonction de rappel à appeler ici ; le corps de la boucle n'est qu'un bloc. Cependant, en raison de la manière dont la sémantique de la portée du bloc est définie, un nouvel objet d'environnement lexical est créé pour chaque itération de boucle. Cela signifie que, comme pour les rappels forEach
回调类似,每次循环迭代都有一个新的 foo
,即使不需要函数调用。 (如果您要在该块内创建事件处理程序或类似的事件处理程序,这非常方便。)(如果我们使用 var
代替,则不会每次都有一个新的,var
会跳出该块到周围函数作用域或全局作用域,因为 var
不是块作用域。这是我建议永远不要在新代码中使用 var
, il existe un nouveau foo
pour chaque itération de boucle, même si aucun appel de fonction n'est requis. (C'est très pratique si vous souhaitez créer des gestionnaires d'événements ou des gestionnaires d'événements similaires à l'intérieur du bloc.) (Si nous utilisons var
à la place, nous n'en aurons pas un nouveau à chaque fois, < code>var sortira du bloc dans la portée de la fonction environnante ou la portée globale, car var
n'est pas une portée de bloc. C'est ma recommandation de ne jamais utiliser var dans un nouveau code une des raisons.