2017-09-14 1 views
1

Je veux être sûr, http://eloquentjavascript.net/10_modules.html, par exemple:EloquentJavaScript - Référencement par ce mot clé ne fonctionne pas?



    (function(exports) { 
     var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
        "Thursday", "Friday", "Saturday"]; 

     exports.name = function(number) { 
     return names[number]; 
     }; 
     exports.number = function(name) { 
     return names.indexOf(name); 
     }; 
    })(this.weekDay = {}); 

    console.log(weekDay.name(weekDay.number("Saturday"))); 
    // → weekDay not defined 

Il fonctionne quand je le lance sur le site mentionné, mais lorsque je tente de faire de même dans le code vs (+ Node.js à debug), il dit que weekDay n'est pas défini. J'ai compris que la cause de ceci est que ce mot-clé ne se réfère pas à l'objet qui contient le code entier, mais il se réfère à l'objet qui contient l'objet, donc j'ai essayé ceci:

(function(exports) { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
       "Thursday", "Friday", "Saturday"]; 

    exports.name = function(number) { 
     return names[number]; 
    }; 
    exports.number = function(name) { 
     return names.indexOf(name); 
    }; 
    })(weekDay = {}); 

    console.log(weekDay.name(weekDay.number("Saturday"))); 
// → Saturday 

Et cela fonctionne, quelqu'un peut-il expliquer pourquoi? L'argument passé par l'OMI n'est pas traité comme une variable de fonction, mais comme une variable appartenant à l'objet qui appelle la fonction (mais pourquoi le code du livre fonctionne-t-il sur le site Web alors?).

Répondre

1

Tout d'abord, ne vous sentez pas mal de ne pas comprendre this. C'est confu.

Cela résume assez bien this:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch1.md#review-tldr

Props à sensei Kyle.

Mon TL; DR: le this que vous appelez dans un noeud est lié au code qui s'exécute dans le fichier. Le this que vous appelez dans le navigateur est lié à l'objet window qui est un objet spécial disponible dans un navigateur avec des superpuissances restantes des siècles passés.

Rappelez-vous this est une liaison, faite lorsqu'une fonction est invoquée et qu'elle dépend entièrement du site d'appel où la fonction est appelée.

Dans l'exemple sandbox (appelé dans la portée globale du navigateur), this fait référence à l'objet window du navigateur. window est l'objet global du navigateur. Il contient toutes les variables globales. Votre site d'appel est la portée globale. En termes simples, chaque fichier de noeud s'exécute dans sa propre bulle. Chaque fichier a son propre this et le site d'appel est la bulle. Vos variables dans la portée globale ne seront pas automatiquement suspendues sous this dans un module de noeud.

Encore une prise: lisez les livres de Kyle. Va prendre un cours de lui. C'est un professeur incroyable.