2017-02-01 2 views
2

Ich habe gelesen "eloquent Javascript" Buch und ich kann nicht ein kleines Ding in der modules Kapitel.Objekte als Schnittstellen

Er (der Autor) geben uns diesen Code:

(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"))); 
 
// → Saturday

Aber das nächste, was er sagt, ist:

Das bisherige Muster häufig von JavaScript-Module verwendet wird, soll für den Browser. Das Modul wird eine einzelne globale Variable beanspruchen und seinen Code in eine Funktion einbinden, um seinen eigenen privaten Namespace zu haben. B Dieses Muster verursacht immer noch Probleme, wenn mehrere Module denselben Namen beanspruchen oder wenn Sie zwei Versionen eines Moduls nebeneinander laden wollen.

die Frage ist, dass ich die Musterprobleme nicht verstehen kann, könnte mir jemand auf eine spezifischere Art erklären? Vielen Dank.

+0

Nun, stellen Sie sich vor, jemand kam und fügte hinzu '(function (exports) {exports.name = function() {return" Mike ";};}) (this.weekday = {});' Was würde protokolliert werden zur Konsole? –

Antwort

2

Der Code ist im Grunde erstellen eine globale Variable namens weekDay (this im Browser wird windows im äußeren Kontext, wo es eingerichtet wird). Wenn also ein anderes Modul versucht, einen globalen Tag namens "weekDay" zu erstellen, liegt ein Konflikt vor. Der letzte, der es definiert, wird gewinnen und die andere Definition wird weggeblasen werden.

Wenn Sie versuchen, dieses Modul zweimal zu laden (warum sollten Sie in diesem Fall, aber im Allgemeinen), dann können Sie nicht, da Sie nur eine einzige Variable im globalen Raum mit diesem Namen haben können.

+0

Ich verstehe es, danke. –

+0

Ich bin froh, dass ich helfen konnte – rasmeister