2016-11-22 4 views
0

Ich fange gerade an, Javascript ernst zu nehmen. Was ist falsch an meinem Code unten?Aufschlussreiches Modulmuster wurde undefiniert Variable

var Person = (function(name,age){ 
    var name = name, age = age; 
    var print = function(){ 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
    } 

    return {print:print} 
})(); 

Person.print("James",19); 

Ich habe Name und Alter undefiniert. Ich Problem, das ich auch mit diesem Muster gefunden habe, wenn Sie viele Methoden haben, dann am Ende wird Ihre Rückkehr sein

return {methodA:methodA, methodB:methodB, methodC:methodC} das ist so hässlich für mich. Sollte ich nur in der Rückkehr meine Methode wickeln wie

return{ 
    methodA: function(){ 

    } 
}; 
+1

nicht das Problem,

geteilt, aber beachten Sie, dass die Zeile 'var name = Name, Alter = Alter; 'konnte ohne Verhaltensänderung entfernt werden - die Funktionsargumente sind bereits Teil des Clos Sie müssen also nicht versuchen, sie in lokale Variablen zu kopieren, und wenn Sie versuchen, eine lokale Variable mit demselben Namen wie ein Funktionsargument zu erstellen, wird nichts unternommen. – nnnnnn

Antwort

1

Wenn Sie Ihre Methode Argumente übergeben möchten, sollten Sie sie in Ihrer print Funktion, wie so setzen.

var Person = (function(){ 
 
    var print = function(name,age){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})(); 
 

 
Person.print("James",19);


Alternativ Sie könnten versuchen, die Argumente in die IIFE direkt zu passieren, aber ich bin nicht sicher, ob ich den Punkt sehen dabei, dass wenn das der Fall.

var Person = (function(name,age){ 
 
    var print = function(){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})("James",19); 
 

 
Person.print();


Ja, könnten Sie einfach Ihre Methoden für das Objekt zurückgeben, aber das ist nicht technisch Modul Muster enthüllt sein würde.

var Person = (function(){ 
 
    return { 
 
     print: function(name,age){ 
 
      console.log('I"m '+name+', and I"m '+age+' year old'); 
 
     } 
 
    } 
 
})(); 
 

 
Person.print("James",19);

Persönlich, wenn Sie wirklich in die moderne JavaScript erhalten möchten, würde ich ES6 Module oder Commonjs Module, mit einem Builder wie Webpack oder Browserify empfehlen.

+0

ah Ich habe es, lassen Sie Funktion drucken erhalten den Parameter anstelle der Person obj. Ich hab es geschafft! Aber ist das aufschlussreiche Modulmuster? Ich erinnere mich, dass es private Variablen innerhalb des Person-Objekts für die Kapselung gibt. –

+0

@JessJordan Ja, Sie können private Variablen und Funktionen innerhalb dieser Schließung haben. Gib sie einfach nicht zurück. –

+0

ES6-Module haben mit Webpack zu tun? –

1

Es ist wegen Immediately invoked function expression.

Hier gehst du Fixed Snippet.

var Person = (function(name,age){ 
 
    var name = name, age = age; 
 
    var print = function(){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})("James",19); 
 

 
Person.print();

+1

das ist überhaupt nicht flexibel, wie kann meine Person dann dynamisch sein? –

0

Ist das, was Sie wollen, Name und Alter machen variable

var Person = (function(name,age){ 
 
    var name = name, age = age; 
 
    
 
    var print = function(name,age){ 
 
     this.name = name; 
 
     this.age = age; 
 
     console.log('I"m '+this.name+', and I"m '+this.age+' year old'); 
 
     } 
 
    return {print:print} 
 
})(); 
 

 
Person.print("James",19);

Verwandte Themen