Path: csiph.com!aioe.org!news.mixmin.net!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: (JavaScript) Wenn Variable X = Y dann Variable A = B Date: Sun, 28 Jun 2015 23:11:14 +0200 Organization: PointedEars Software (PES) Lines: 186 Message-ID: <7762458.r6rIteaMLD@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1435526059 30488 eJwNw4ENwDAIA7CXRkmAndOU8v8JmyXTw+IkggEOZ5e/LG163UcNw+q67QyFQar7P8QoPbXmAxxjEWY= (28 Jun 2015 21:14:19 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Sun, 28 Jun 2015 21:14:19 +0000 (UTC) User-Agent: KNode/4.14.2 X-User-ID: eJwNy0kBACAIBMBKCgtIHC77R9D/jLBuLYOKQq7cEc6dWbQVq2J19xw2AhzsUY3Q8PFkP+OibctO5W+gj+gBXMgVNQ== Cancel-Lock: sha1:f1FtvW2gPKWwF3yVANeHsN5YM7g= X-NNTP-Posting-Host: eJwNx8kRACEMA7CWcIhzlMME3H8Ju/qJOxCTHgynKNkCbBx1M6Pv7Dde0H8rPyg9pRajW0OeDw9rEOU= Xref: aioe.org de.comp.lang.javascript:4608 Peter J. Holzer wrote: > On 2015-06-28 04:43, Maik Koenig wrote: >> Am 28.06.2015 um 01:36 schrieb Stefan Ram: >>> Falls die Regel doch nicht affin-linear ist, könntest Du die >>> Zuordnung auch in einer globalen Tabelle speichern. Ich nehme >>> an, daß Du den globalen Namensraum in JavaScript nur möglichst >>> wenig verschmutzen willst und deswegen nur /einen/ globalen Namen >>> definierst, nämlich »koenig«. Ein Code-Fragment, das in eine >>> Funktion eingebaut werden könnte, wäre dann beispielsweis: >>> >>> var myglobal = Function( "return this" )(); >>> myglobal.koenig = {}; // falls noch nicht existent >>> var koenig = myglobal.koenig; >>> koenig.Multiplikator = []; >>> koenig.Multiplikator[ 20 ]= 1.6; >>> koenig.Multiplikator[ 21 ]= 1.5; >>> // console.log( koenig.Multiplikator[ 20 ]); >>> // console.log( koenig.Multiplikator[ 21 ]); >>> >>> Danach könntest Du dann fast überall mit >>> >>> Function( "return this" )().koenig.Multiplikator[ Ergebnis ] > > Hmm. Namespace schonen ist gut und schön, aber da sieht der Laie vor > lauter Boilerplate die Lösung nicht mehr. > > (Abgesehen davon scheint mir »Function( "return this" )()« statt »var > myglobal« den Teufel mit dem Beelzebub auszutreiben - es wird halt ein > anderer Namespace "verschmutzt") Nicht notwendigerweise ein anderer. In diesem Fall wird sogar explizit in jedem Fall der globale Namespace auf höchst ineffiziente und fehlerträchtige Weise verschmutzt. Dafür gibt es keinen logischen Grund, denn die Werte müssen nur innerhalb der Funktion bekannt sein. Will man die Initialisierung bei jedem Aufruf vermeiden und somit die Effizienz optimieren, so sollte man stattdessen mit Closures bzw. dem Modul-Muster arbeiten; _nicht_ mit ständigen Referenzen auf das globale Objekt. (Leider hat Stefan aus unserer Diskussion darüber in comp.lang.javascript [0] die falshcen Schlussfolgerungen gezogen.) Ausserdem ist “Multiplikator” ein ungeeigneter Bezeichner, denn er suggeriert einen hier nicht vorhandenen Konstruktor. Daher: var koenig = (function () { var o = {multiplikator: []}; o.multiplikator[20] = 1.6; o.multiplikator[21] = 1.5; // console.log(koenig.multiplikator[20]); // console.log(koenig.multiplikator[21]); o.setY = function () { var x = document.getElementById("x").value; document.getElementById("y").value = koenig[x]; }; return o; }()); anschliessend: koenig.setY(); Jedoch siehe unten. >> Was ich mir erhofft hatte: Ich baue eine Tabelle (imho vgl. Array in >> JavaScript?) in der ich einfach durch Kommata getrennt alle Werte >> eintrage. > > Wenn Du Arrays schon kennst, warum verwendest Du sie dann nicht einfach? > > Z.B. so: > > > >
> Das name-Attribut erscheint hier unnötig, da das Formular nicht (cross- browser) abgesendet werden kann (action-Attribut fe lt). “javascript:” ist hier unnötig bzw. syntaktisch falsch. Der “/” ist auch unnötig, aber nur dann syntaktisch falsch, wenn es sich nicht um XHTML oder HTML5 handelt (da hier das type-Attribut fehlt, ist es wahrscheinlicher gültiges HTML5 statt ungültiges XHTML). Semantisch falsch ist er in HTML bis einschliesslich Version 4.01 und in XHTML, das als text/html ausgeliefert wird, weil dort “” äquivalent zu “>” ist (eine manchmal eingebaute Fehlerkorrektur behandelt das *manchmal* anders). [2] Statt in der Funktion erneut die Referenz zum Objekt, welches das das Event auslösende Element representiert, zu übermitteln, kann man diese auch einfach übergeben. Dann kann sogar das id-Attribut weggelassen werden (wenn man den Wert sonst nicht braucht): JS/ES: function setY (x) { x.form.elements["y"].value = a[x.value]; } HTML: Dies kann dann analog zu oben auch stärker objektorientiert – var koenig = { factor: [0, 3.17, 2.37, 2.02, 1.78], setY: function (x) { x.form.elements["y"].value = this.factor[x.value]; } }; … – und zusätzlich mit dem Modul-Muster implementiert werden, so dass die Werte von aussen nicht direkt änderbar sind: var koenig = (function () { var factor = [0, 3.17, 2.37, 2.02, 1.78]; return { setY: function (x) { x.form.elements["y"].value = factor[x.value]; } }; }()); “factor” wird so quasi zu einer privaten Eigenschaft des Moduls und setY() zu seiner so genannten “privilegierten” Methode. > >
Ergänzend sollte erwähnt werden, dass MVVM (Model–View ViewModel), wie es zum Beispiel AngularJS [3] implementiert, genau für solche Fälle entwickelt wurde: Ein Steuerelement ändert seinen Wert, und ein anderes entsprechend dessen auch. Denn der Wert des einen Steuerelements ändert sich über Bindungen an ein Datenmodell auch in diesem, und das andere Steuerelement ist an dasselbe Datenmodell gebunden. Zukünftig (ECMAScript Edition 7) könnte dies mit Object.observe() auch ohne Events, Framework und Polling relativ einfach implementierbar sein. [4] _______ [0] pp. [1a] Lahn, Thomas (2012). Features von ECMAScript-basierten Programmiersprachen. BSc CS SUPSI, FFHS. Kapitel 1. Siehe auch “ES Matrix” in der Signatur. [1b] [1c] [2] [3] [4] -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not cc me. / Bitte keine Kopien per E-Mail.