Voir le problème de fermeture suivant
var x=10;
function fn() {
console.log(x);
}
function show(f) {
var x=20;
(function() {
f();
})();
}
show(fn);
Il imprime 10 au lieu de 20. Lorsque x est pris, ne recherche-t-il pas le long de la chaîne de portée ? Si la chaîne de portée est déterminée lors de la création de la fonction, le résultat sera 10. Si elle est déterminée lorsque la fonction est créée appelé, il devrait être 20. Oui Aucune déclaration précise sur la chaîne de portée ? À quoi devrait ressembler la chaîne de portée exacte ici ? Est-ce que fn et show sont au même niveau ou est-ce que fn est dans show ?
La chaîne de portée est déterminée lorsque la fonction est définie.
https://developer.mozilla.org...
La chaîne de périmètre est dynamique, elle est donc déterminée au moment de l'appel.
Mais dans votre code, la fonction() définie par la fermeture est la portée la plus externe de la liaison
La fonction déclarée par fonction est par défaut la portée la plus externe de la liaison
(J'apprends aussi...)
Créez une chaîne de portée contenant des objets variables globales lors de la création de la fonction et stockez-la dans l'attribut interne [[Scope]]. Lorsque la fonction est exécutée, un environnement d'exécution sera créé en copiant les objets dans l'attribut [[Scope]], la chaîne de portée de l'environnement d'exécution sera construite et ses propres objets actifs seront poussés dans le front-end de. la chaîne de portée pour former une chaîne de domaines de fonction complète. [[Scope]] contient une référence à la variable globale, pas une copie de la valeur.
La méthode d'appel de fermeture est équivalente à l'effet suivant. L'exemple ci-dessous illustre par comparaison que la chaîne de portée est liée à la position lorsque la fonction est définie.
Liens de questions pertinents ajoutés. /q/10…. Il y a une discussion sur les chaînes de portée.
En mode non strict, ce point de tout IIFE est la fenêtre
Ce qui précède n'est pas correct. . .