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 })
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
: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 nouveaufoo
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 utilisonsvar
à la place, nous n'en aurons pas un nouveau à chaque fois, var sortira du bloc dans la portée de la fonction environnante ou la portée globale, carvar
n'est pas une portée de bloc. C'est ma recommandation de ne jamais utiliservar dans un nouveau code une des raisons.