Variablen aus Text erzeuegen
roger
- javascript
Hallo,
ich möchte gerne eine Funktion schreiben die mir aus einem Zahlenwert pro Bitstelle eine Variable generiert. Der Variablenname wird als "Text" übergeben.
So soll z.B. der Aufruf sein.~~~javascript
bin32Bit(value,"varnamebit0","varnamebit1","varnamebit2",...);
1\. wie muss ich es machen damit ich die Variablen erzeugen kann.
2\. wie stelle ich es an damit die Variablen auch außerhalb der Funktion/Global verfügbar sind.... wenn überhaupt möglich ??
Gruß
roger
hi,
mh dynamische variablen in js? ansich noch nix von gehört
am besten du löst es mit ein globalen array :) würde mir spontan einfallen
hoffe es hilft dir
Hallo,
ich möchte gerne mit den Variablen weiterarbeiten. Damit ich die einzelnen "bits" leichter identifizieren kann, wäre ein Name einfacher.
Somit hätte jedes Bit einen eigenen Namen.
Wenn ich ein Array nehmen habe ich wieder Bit0...Bit32. Sollte einmal die Adressierung geändert werden muss ich das komplette Programm ändern. Wenn die Bits Namen haben brauche ich nur die Zuweisung Bit->Name ändern.
Gruß
roger
Hi,
ich möchte gerne mit den Variablen weiterarbeiten. Damit ich die einzelnen "bits" leichter identifizieren kann, wäre ein Name einfacher.
Nein, das wäre nicht einfacher - weil du dann für jeden Zugriff den Namen erst mal zusammenbasteln musst.
Wenn ich ein Array nehmen habe ich wieder Bit0...Bit32.
Nein, hast du nicht.
Du weisst offenbar noch gar nicht, wie man mit Arrays umgeht - deshalb schlage ich vor, du informierst dich mal: http://de.selfhtml.org/javascript/objekte/array.htm#allgemeines
Sollte einmal die Adressierung geändert werden muss ich das komplette Programm ändern.
Warum sollte sich die Adressierung ändern?
Wenn die Bits Namen haben brauche ich nur die Zuweisung Bit->Name ändern.
Und wie und wo willst du das machen, wenn dein Script an zig Stellen auf eine Variable namens Bit4711 zugreift?
MfG ChrisB
Lieber roger,
was ist Dein eigentliches Problem, das Du auf diese Weise lösen willst? Vielleicht ist Dein hier vorgestellter Ansatz ja unnötig kompliziert...?
Liebe Grüße,
Felix Riesterer.
@@roger:
nuqneH
- wie muss ich es machen damit ich die Variablen erzeugen kann.
Mit <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=Schema 4>.
- wie stelle ich es an damit die Variablen auch außerhalb der Funktion/Global verfügbar sind.... wenn überhaupt möglich ??
Globale Variablen sind in JavaScript Eigenschaften des window
-Objekts.
In einer Schleife gehst du die http://de.selfhtml.org/javascript/objekte/function.htm#arguments@title=Argumente durch:
function bin32Bit(value)
{
for (var i = 1; i < arguments.length; i++, …)
window[arguments[i]] = …;
}
Für die … dürften die http://de.selfhtml.org/javascript/sprache/operatoren.htm@title=Operatoren &
und >>
(>>=
) für dich interessant sein.
Qapla'
Morgen,
das ist genau das was ich will, obwohl ich es nicht ganz verstehe.
Bitte korrigiert mich falls ich falsch liege.
z.B.
function bin32Bit(value)
{
// beginne bei 1 weil argument 0 mein Zahlenwert ist
// ab 1 sind dann meine "Varnamen"
for (var i = 1; i < arguments.length; i++, …)
window[arguments[i]] = bitzustand_aus_anderer_funktion;
// window[arguments[i]] hier die übergebenen Namen "varname"
// an das window-objekt plus Zustand der neue variable, damit diese global // sind.
}
Ist das so richtig. ??
Frage 1:
es wird zyklisch aufgerufen. Muss ich abfragen ob das x.y window objekt schon vorhanden ist oder wird es nur einmal erzeugt, wenn nicht vorhanden und dann später nur noch beschrieben... so denke ich ?
Frage 2:
Der Aufruf der Funktion würde dann z.B. so bei mir aussehen
bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)
Natürlich frage ich auf "" ab... vor dem window[argu...]
Das wäre für mich eine super Lösung.
Danke,Danke
roger
@@roger:
nuqneH
// beginne bei 1 weil argument 0 mein Zahlenwert ist
// ab 1 sind dann meine "Varnamen"for (var i = 1; i < arguments.length; i++, …)
Richtig.
window[arguments[i]] = bitzustand_aus_anderer_funktion;
// window[arguments[i]] hier die übergebenen Namen "varname"
// an das window-objekt plus Zustand der neue variable, damit diese global // sind.
Verstehe nicht ganz, was du sagen willst.
bitzustand_aus_anderer_funktion?? Du willst ganz einfach Bits maskieren. Deshalb hatte ich dich auf den &
-Operator hingewiesen.
Und wenn du in der Schleife value
bitweise verschiebst, brauchst du nur immer dasselbe Bit. Deshalb hatte ich dich auf den >>
-Operator hingewiesen. (Dies würde ich an der Stelle der … in for
tun.
es wird zyklisch aufgerufen. Muss ich abfragen ob das x.y window objekt schon vorhanden ist oder wird es nur einmal erzeugt, wenn nicht vorhanden und dann später nur noch beschrieben... so denke ich ?
Das windows
-Objekt ist immer vorhanden; da musst du gar nichts abfragen.
Der Aufruf der Funktion würde dann z.B. so bei mir aussehen
bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)
Natürlich frage ich auf "" ab... vor dem window[argu...]
Es sind nicht alle Bits von value
für dich intersessant? Ja, dann:
if (arguments[i]) window[arguments[i]] = …;
Dann könnte der Funktionaaufruf auch so aussehen:
bin32Bit(42, "namefuerbit0", "namefuerbit1", null, "namefuerbit3");
oder so:
bin32Bit(42, "namefuerbit0", "namefuerbit1", false, "namefuerbit3");
Das wäre für mich eine super Lösung.
Na, dann fülle mal die … mit Leben!
Qapla'
Der Aufruf der Funktion würde dann z.B. so bei mir aussehen
bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)
Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?
Das wäre für mich eine super Lösung.
Naja, globale Variabeln sind alles andere als super
Struppi.
@@Struppi:
nuqneH
Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?
Das sagte er doch: Er möchte sprechende Namen für die Bits.
Naja, globale Variabeln sind alles andere als super
Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten:
myBits = {};
In der Funktion dann:
if (arguments[i]) myBits[arguments[i]] = …;
Qapla'
@@Gunnar Bittersmann:
nuqneH
Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
In der Funktion dann: […]
Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des windows
-Objekts sein sollte, sondern Methode des myBits
-Objekts:
myBits = {};
myBits.bin32Bit = function(value)
{
…
};
oder anders notiert:
myBits = {
this.bin32Bit = function(value)
{
…
};
};
Einen passenderen Namen als "bin32Bit" sollte die Methode auch bekommen; "refresh" dürfte sich anbieten.
Und für "myBits" fällt dir sicher auch ein besserer Name ein.
Qapla'
Abend,
Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
In der Funktion dann: […]Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des
windows
-Objekts sein sollte, sondern Methode desmyBits
-Objekts:
myBits = {
this.bin32Bit = function(value)
{
…
};
};
Das verstehe ich nicht. Wie soll in der Funktion x.[arguments[i]] aussehen ??
Gruß
roger
@@roger:
nuqneH
myBits = {
this.bin32Bit = function(value)
{
…
};
};
> Das verstehe ich nicht. Wie soll in der Funktion x.[arguments[i]] aussehen ??
Ähm: <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=Schema 4>.
Was soll der `.`{:.language-javascript}-Operator da?
Entweder sprichst du eine Objekteigenschaft per `Objekt.Eigenschaft`{:.language-javascript} an oder per `Objekt["Eigenschaft"]`{:.language-javascript}. Wenn "Eigenschaft" nicht fest ist, sondern in einer Variablen `String`{:.language-javascript}, bleibt nur die zweite Variante:
~~~javascript
var String = "Eigenschaft";
Objekt[String] = …;
Geben wir den Dingern mal gleich sprechende Namen: myBits → flags, bin32Bit → refresh.
Dann sieht das so aus:
flags = {
var thisObj = this;
refresh = function(value)
{
for (var i = 1; i < arguments.length; i++, …)
thisObj[arguments[i]] = …;
};
};
flags.refresh(42, "foo", "bar", null, "baz");
thisObj
ist nötig, weil sich this
innerhalb von refresh
nicht auf das flags
-Objekt beziehen würde, sondern auf das refresh
-Funktionsobjekt.
Falls du mehrere Instanzen dieses Objekts brauchen solltest, sieht das dann so in etwa aus:
function Flags()
{
var thisObj = this;
refresh = function(value)
{
for (var i = 1; i < arguments.length; i++, …)
thisObj[arguments[i]] = …;
};
};
flags1 = new Flags();
flags1.refresh(42, "foo", "bar", null, "baz");
flags2 = new Flags();
flags2.refresh(43, "foo", "bar", null, "baz");
Qapla'
Hallo,
Dann sieht das so aus:
flags = {
var thisObj = this;
dann aber refresh ohne var?
refresh = function(value)
{
for (var i = 1; i < arguments.length; i++, …)
thisObj[arguments[i]] = …;
};
Es sollte vielleicht heißen:
~~~javascript
function refresh (value)
> {
> for (var i = 1; i < arguments.length; i++, …)
> thisObj[arguments[i]] = …;
> };
oder eher:
this.refresh = function (value)
> {
> for (var i = 1; i < arguments.length; i++, …)
> thisObj[arguments[i]] = …;
> };
Gruß, Don P
@@Don P:
nuqneH
this.refresh = function (value)
Ja, so dachte ich das; ich hatte 'this.' vergessen. Das ist aber im Objekt-Literal falsch, wie Struppi sagte.
Also:
flags = {
refresh: function(value)
{
for (var i = 1; i < arguments.length; i++, …)
if (arguments[i]) flags[arguments[i]] = …;
};
};
Im Konstruktor wäre es richtig:
function Flags()
{
var thisObj = this;
this.refresh = function (value)
{
for (var i = 1; i < arguments.length; i++, …)
if (arguments[i]) thisObj[arguments[i]] = …;
}
};
Qapla'
Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
In der Funktion dann: […]Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des
windows
-Objekts sein sollte, sondern Methode desmyBits
-Objekts:
Oder des String Objektes, wenn value ein String ist.
oder anders notiert:
myBits = {
this.bin32Bit = function(value)
{
…
};
};
Nein, du meinst:
~~~javascript
myBits = {
bin32Bit: function(value)
{
…
}, ....
};
Struppi.
@@Struppi:
nuqneH
Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des
windows
-Objekts sein sollte, sondern Methode desmyBits
-Objekts:Oder des String Objektes, wenn value ein String ist.
Eher nicht.
Nein, du meinst:
myBits = {
bin32Bit: function(value)
{
…
}, ....};
Ja, hast recht.
Wofür sollte ', ....' stehen?
Qapla'
--
Volumen einer Pizza mit Radius z und Dicke a: pi z z a
Wofür sollte ', ....' stehen?
Das da noch mehr Einträge stehen könnten.
myBits = {
bin32Bit: function(value)
{
…
},
bin16Bit:function(value)
{
…
},
// usw.
};
Wenn man dafür schon ein eigenes Objekt bemühen möchte.
Struppi.
Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?
Das sagte er doch: Er möchte sprechende Namen für die Bits.
Das ist Unsinn. Was ist an bit0 "sprechender" als an bit[0]? Das hat nur Nachteile.
Struppi.
@@Struppi:
nuqneH
Das sagte er doch: Er möchte sprechende Namen für die Bits.
Das ist Unsinn. Was ist an bit0 "sprechender" als an bit[0]?
Natürlich nichts. Ich hatte roger aber so verstanden, dass die Namen gar nicht die Numerierung der Bits enthalten sollen.
Die von ihm beispielhaft angeführten "varnamebit0", "varnamebit1", "varnamebit2", … waren diesbezüglich verwirrend. Besser wären "foo", "bar", "baz", … gewesen. Oder gleich das, was diese Flags bezeichen.
Qapla'
Die von ihm beispielhaft angeführten "varnamebit0", "varnamebit1", "varnamebit2", … waren diesbezüglich verwirrend. Besser wären "foo", "bar", "baz", … gewesen. Oder gleich das, was diese Flags bezeichen.
Jetzt verstehe ich's.
Dann ist ein Objekt am sinnvollsten.
function parseByte(byte) {
// prüfen ob byte ein gültiger Wert ist
return {
x: byte & 1,
y: byte & 2,
status: byte & 3,
// usw. ...
}
}
Struppi.
@@Struppi:
nuqneH
Dann ist ein Objekt am sinnvollsten.
Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion parseByte(byte)
erzeugen, sondern diese Funktion als Methode des Objekts implementieren.
status: byte & 3,
Du meintest 4?
Qapla'
Dann ist ein Objekt am sinnvollsten.
Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion
parseByte(byte)
erzeugen, sondern diese Funktion als Methode des Objekts implementieren.
Ich nicht, das Object Objekt sollte nur zur Not verändert werden.
status: byte & 3,
Du meintest 4?
Stimmt.
Struppi.
@@Struppi:
nuqneH
Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion
parseByte(byte)
erzeugen, sondern diese Funktion als Methode des Objekts implementieren.Ich nicht, das Object Objekt sollte nur zur Not verändert werden.
Nein, ich meinte nicht eine Methode des Object
-Objekts, sondern eine Methode des eigenen Objekts (Flags?).
Qapla'