Questions qui se sont posées lors de l'étude de la méthode d'écriture modulaire js, le code est le suivant
// 立即执行函数写法,保证外部不能访问到 count
var module1 = (function() {
var count = 0;
var m1 = function() {
return count;
};
return {
m1: m1
};
})();
// 如果现在想给 module1 添加新的方法
module1 = (function(mod) {
mod.m2 = function() {
return count;
}
return mod;
})(module1);
console.log(module1.m1());//可以访问到 count
// console.log(module1.m2());
Je me demande pourquoi module1.m2()
访问不到 count
?
Un indice : la raison pour laquelle m1 peut accéder à count est que m1 et count sont déclarés dans la même fonction, c'est-à-dire qu'ils sont dans la même portée, mais la fonction où se trouve m2 n'est pas dans la même fonction que count. la portée, il n'y a aucune relation entre les fonctions intégrées dans les fonctions, donc naturellement elles ne sont pas accessibles.
Le questionneur pense que module1 lui-même est sous la même fonction que count, il ajoute donc une méthode à module1. Cette méthode est sous la même portée que count ?
En raison de la portée lexicale, les fonctions JS ont une portée statique, ce qui signifie que lorsque la fonction est définie, il a été déterminé sur quel symbole la variable à l'intérieur doit être montée. Lorsque vous définissez m1 en interne, la fonction anonyme renvoie un décompte. sera déterminé comme étant externe à cette fonction lorsqu'elle sera définie
var count=0
.Lorsque vous définissez m2, la fonction anonyme renvoie un nombre. La recherche de symbole pour ce nombre consiste d'abord à vérifier s'il se trouve à l'intérieur de l'endroit où il est défini. Sinon, vérifiez l'endroit où la fonction de couche supérieure est définie, et alors l'endroit le plus extérieur est une variable globale, donc le nombre ici est une variable globale.
Donc module1.m2() ne peut pas accéder à la variable count que vous avez définie sur m1 En raison de la portée lexicale statique, m2 ne peut pas la suivre.