2011-01-12 9 views
1

hier ein Javascript Probe ist:Wie kommt es, dass Array nicht definiert ist?

var obj = 
{ 
    options: [], 

    init: function() 
    { 
     options['one'] = 'one'; 
     for(k in options) 
     { 
      alert(options[k]); 
     } 
    } 
}; 

statt Aufforderung "eins", sagt es nicht definiert, warum?

+0

Seien Sie vorsichtig, wenn Sie eine 'for x in obj'-Schleife verwenden, wenn Sie diesen Code ausführen, werden Sie eine ganze Reihe interessanter Funktionen sehen, die alarmiert werden. – david

Antwort

3

Sie müssten es als obj.options verweisen.

Abgesehen davon sollten Sie ein Objekt {} anstelle eines Arrays [] verwenden, wenn Sie keine numerischen Indizes verwenden.

var obj = 
{ 
    options: {}, 

    init: function() 
    { 
     obj.options['one'] = 'one'; 
     for(k in obj.options) 
     { 
      alert(obj.options[k]); 
     } 
    } 
}; 

Wenn rufen Sie die init() Funktion aus der obj Referenz, dann könnte man this innerhalb der init Funktion anstelle von obj verwenden.

var obj = 
{ 
    options: {}, 

    init: function() 
    { 
     this.options['one'] = 'one'; 
     for(k in this.options) 
     { 
      alert(this.options[k]); 
     } 
    } 
}; 

obj.init(); // Makes `this` refer to `obj` in the `init` function 

Wie @CMS erwähnt, sollten Sie Ihre Variablen mit var erklären. In Ihrer for Schleife ist k mit var nicht deklariert und wird als solche eine globale Variable.

+0

hmm warum ist das? – dave

+0

oder funktionieren diese Optionen nicht? – dave

+0

this.options würde auch funktionieren. – david

0

Was Sie tun, sieht in Form und Konzept sehr ähnlich zu etwas namens das "Modul-Muster" in Javascript. Es ist ein sehr leistungsfähiges Werkzeug, und wenn Sie lernen wollen, empfehle ich Ihnen, es zu lesen.

Hier ist Ihr Code, neu geschrieben als ein Modul, mit Änderungen zu vermeiden, den globalen Geltungsbereich zu verschmutzen, und ein potenzielles Problem mit Ihrer for in Schleife zu beheben. Es definiert auch options als ein Objekt und nicht als ein Array, wie Sie scheinen, es als eine Hashtabelle und nicht mit numerischen Indizes zu verwenden.

Verwandte Themen