+function foo(){
foo=10;//我的问题代码
console.log(foo);//方法自己
}();
console.log(typeof foo);//undefined 观察是否全局污染
Je voudrais demander où va le 10 qui est réaffecté à foo à l'intérieur de la fonction foo, et comment la fonction foo du même nom empêche la pollution mondiale. Veuillez la résoudre et la développer
.
L’interlocuteur peut poser cette question, c’est très bien. Cependant, ce problème peut être résolu par la pratique. . .
Tout d'abord, le questionneur n'a aucun problème avec la façon d'écrire IIFE. Il existe de nombreuses façons d'écrire IIFE Les plus courantes sont ce que @ewind a dit et :
.Il y en a aussi des plus rares :
Parlons ensuite du code :
Lors de l'attribution d'une valeur au nom de la fonction actuelle dans une fonction :
foo = 10;
Invalide. (Je suis d'accord avec @ewind, il sera ignoré ici. Il devrait y avoir une explication plus raisonnable.) L'analyseur JS l'ignorera.Le résultatque j'ai exécuté dans la console Chrome est :
Cela prouve ce que j'ai dit ci-dessusignorer.
Ensuite, comme IIFE simule la portée du bloc, l'environnement externe ne peut pas accéder aux variables internes. Donc ce n'est pas défini.
@ewind a dit que parce que foo est une fonction anonyme, alors quoi ?
Évidemment, les concepts sont confus. La fonction foo n'est pas une fonction anonyme.
MDN
Tout d'abord, le code posté est incomplet. La version complète devrait être comme ça
Cela semble contre-intuitif, car foo sans déclaration var ne pollue pas la portée globale.
Mais si le nom de la variable déclaré dans la fonction n'est pas foo, c'est très intuitif, de la manière suivante :
Alors pourquoi un problème survient-il lorsque la variable déclarée dans la fonction porte le même nom que le nom de la fonction ? Vous pouvez voir cet exemple :
Une fois que la fonction immédiatement exécutée porte le nom de fonction foo, les arguments.callee lors de l'appel sont en fait une référence à foo. En comparant les deux, nous pouvons constater que foo est l'objet fonction à ce moment-là. À ce stade, l'opération d'affectation ne prendra pas effet. Lorsqu'il rencontrera la variable foo sans déclaration var, l'interpréteur trouvera également cet objet fonction, évitant ainsi la pollution dans la portée globale.