recherche

Maison  >  Questions et réponses  >  le corps du texte

Javascript forEach crée-t-il un nouveau contexte d'exécution pour chaque élément du tableau, ou met-il simplement à jour l'environnement lexical du contexte d'exécution actuel ?

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粉663883862P粉663883862231 Il y a quelques jours415

répondre à tous(1)je répondrai

  • P粉674876385

    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.

    répondre
    0
  • Annulerrépondre