(function(){
var obj, sayHi;
obj = {};
sayHi = function(str){
console.log(str);
}
obj.sayHello = function(str1){
sayHi(str1);
}
obj.sayYo = function(str2){
console.log(str2);
}
window.obj = obj;
})()
obj.sayHello("hello world!"); // hello world!
obj.sayYo("yo, what's up?"); // yo, what's up?
Un petit problème que j'ai moi-même rencontré, je ne sais pas si vous l'avez. J'aime écrire des fonctions anonymes récemment. Quand j'ai vu cela pour la première fois, je l'ai habituellement regardé à l'envers et j'ai pensé qu'il exposait uniquement l'objet sayHello. exécuté ? Quand peut-on exécuter sayHi ?
Je pensais avoir déjà vu le mécanisme de fonctionnement de js.
Je ne sais pas si c'est le cas :
js devrait être pré-analysé lors de l'exécution
Donc avant d'exécuter sayHello, sayHello dans la fonction anonyme aurait dû devenir
obj.sayHello = function(str1){
function(str1){
console.log(str1);
};
};
Je ne suis pas un professionnel, donc je ne sais pas si c'est la bonne façon de le comprendre ?
Il s'agit d'un problème de portée.
N'oubliez pas que la fonction a enregistré la portée lors de sa création. Peu importe où vous l'appelez plus tard, le résultat sera le même, tout comme votre code, si vous le modifiez ainsi, le résultat sera toujours le même (. par souci de simplicité d'analyse ci-dessous, donnez ceci immédiatement. Appelez la fonction et donnez-lui un nom, appelez-la test) :
Analyse, lorsque la fonction obj.sayHello est créée, elle enregistrera toutes les portées actuelles :
À l'heure actuelle, il est évident que la fonction sayHi est dans la portée du test, donc cette référence est directement enregistrée dans sayHello Même si elle est exécutée dans la portée globale, la fonction sayHi redéfinie dans la portée globale ne peut toujours pas l'affecter, car. c'est du test Recherche dans la fonction, vous comprendrez si vous regardez l'exemple suivant :
La portée de la fonction foo est foo elle-même + la portée globale, donc même si elle est exécutée dans la fonction d'exécution immédiate, la valeur de sortie ne sera pas 20, mais seulement 10
Ce n'est pas une bonne compréhension, cela devrait être un concept de clôture. http://www.ruanyifeng.com/blo...
Lorsque vous accédez à une variable dans une fonction, vérifiez d'abord si la fonction déclare la variable. Sinon, allez dans la portée externe pour la trouver. C'est le cas ici, dans la fonction (function(){})() que j'ai trouvée. sayHi, donc je l'ai appelé directement. Si sayHi n'a pas été déclaré à ce moment-là, continuez à le chercher dans la couche externe de la fonction. Si je trouve directement la situation globale, elle n'existe toujours pas. Alors il n'y en aura plus