2012-04-15 3 views
2

Ich frage mich, wie die „nam“ e Variable wie so in einem JavaScript-Objekt mit einer Funktion zuzugreifen:Javascript variabler Umfang. Wie greife ich auf eine Objektvariable von einer internen Objektfunktion zu?

function myObj() { 
    this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function() { 
      alert(this.vars.name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(); 

Was soll ich hier fehlt?

kann ich den Namen var, wenn ich einen Verweis auf sich wie geben:

function myObj() { 
    this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function(name) { 
      alert(name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(obj.vars.name); 

aber das scheint ein wenig überflüssig ... Gedanken?

Antwort

5

Das Problem ist, dass this.functions.sayName in Ihrer Funktion, die this Schlüsselwort anstelle des aktuellen Objekts -this.functions bezieht. Hier

ist eine Lösung für dieses Problem:

function myObj() { 
    var vars = this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function() { 
      alert(vars.name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(); 

Dies schafft eine lokale Variable innerhalb von myObj, die von jedem inneren Umfang zugreifen können. Es macht auch die Variable an die Außenwelt als eine Eigenschaft von jeder myObj Klasse instanziiert, was bedeutet, dass Sie immer noch so etwas wie

obj.vars.name = 'test'; 

tun können, und es wird immer noch den internen Zustand des Objekts ändern. Das ist wahrscheinlich die beste Lösung für Ihr aktuelles Setup.

Das Verhalten des Schlüsselworts this in JavaScript ist interessant. Ich empfehle das ausgezeichnete writeup im Mozilla Developer Network.

+0

tolle Antwort. Ich muss tatsächlich die Variablen für externe Komponenten zugänglich halten, daher ist das Hinzufügen von this.vars = der Schlüssel. Vielen Dank! –

1

Man könnte es wie folgt tun:

var thisObj = this; 
this.functions = { 
    sayName: function() { 
     alert(thisObj.vars.name); 
    } 
} 

nicht sicher, ob das die beste Lösung, aber es funktioniert. Das Javascript dieses bezieht sich immer auf den internen Bereich, wenn Sie in einer Funktion sind.

1

Entfernen Sie einfach this:

function myObj() { 
    var vars = { 
     name: 'bob', 
     age: '42' 
    }; 
    this.functions = { 
     sayName: function() { 
      alert(vars.name); 
     } 
    }; 
}; 

var obj = new myObj(); 
obj.functions.sayName();​ 

LIVE DEMO

+1

Das erstellt eine implizite globale und entkoppelt das 'vars' Objekt von einem bestimmten Objekt. Wenn Sie ein anderes 'myObj' instanziieren, haben Sie mehrere Status gemeinsam. – Reid

+0

@Reid. Ich hatte einen kleinen Fehler, werfen Sie einen Blick auf die aktualisierte Geige. – gdoron

Verwandte Themen