javascript - problèmes liés à la fonction anonyme js
怪我咯
怪我咯 2017-07-05 10:50:25
0
2
995
(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 ?

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(2)
刘奇

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) :

(function test(){
    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;
    
})()
    var sayHi = function(str) { // 就算在全局作用域里面加个sayHi函数,也不会对sayHello有任何影响
        console.log("Hi");
    }
    obj.sayHello("hello world!");     // hello world!
    obj.sayYo("yo, what's up?");      // yo, what's up?

Analyse, lorsque la fonction obj.sayHello est créée, elle enregistrera toutes les portées actuelles :

sayHello.[[scope]] = [
    sayHelloContext.AO,
    testContext.VO,
    globalContext.VO
]

À 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 :

var x = 10;
 
function foo() {
  alert(x);
}
 
(function () {
  var x = 20;
  foo(); // 10
})();

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal