• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Mehrfach Return mit "this" abgreifen

E

ECJS

Guest
Hallo,
ich habe ein kleines Problem, und zwar liefert mir eine Funktion zwei Return Werte, z.B. so :
Code:
a function() {
   // ...
   return [a, b];
}
Hier drann möchte ich gerne eine weitere Funktion mittels Punkt-Notation hängen, welche den Return der ersten Funktion per "this" abgreift.
Code:
a().b();
Wenn nur eine Variable returned wird klappt dies auch sehr gut, nur weiß ich nicht, wie dies bei mehreren Variablen funktionieren soll. Ich habe schon Folgendes versucht, leider ohne Erfolg :
Code:
this[0] bzw. this[1]

Dankeschön im Vorraus.
 
Das funktioniert nicht, da b keine Eigenschaft eines Arrays ist (sollte so auch in der Fehlerkonsole stehen).

Du könntest sowas machen:
Code:
function a(){
	return [1, 2];
}
function b(n){
	alert(n);
}
a().forEach(b);
- aber ohne näheren Kontext können wir da auch nicht nähere Hilfe geben.
 
Also ein bisschen mehr Kontext: Die erste Funktion liefert zwei Werte, die ich beide an eine andere Funktion mittels Return übermitteln möchte. Natürlich könnte man beide Werte in eine Variable packen und diese in der zweiten Funktion wieder auseinander pflücken, aber wenn es möglich wäre, würde ich gerne den "schöneren" Weg nehmen. Die zweite Funktion soll an die erste angehangen werden und kriegt den Return mit, zumindest wenn nur eine Variable übergeben wird, auf diese kann dann leicht mit "this" zugegriffen werden, nur zwei Variablen machen Probleme. Das ganze soll vll. am Ende wie eine "unendliche" Chain funktionieren, da die Variablen immer an die nächste Funktion weiter gegeben werden können, es sollte am Ende ungefähr so aussehen :

Code:
function ersteFunktion() {
   var a = 10;
   var b = 20;

   return [a, b];
}

function zweiteFunktion() {
   // Zugriff auf den return der "ersteFunktion"
   // var a = this[0]; ??
   // var b = this[1]; ??
}

ersteFunktion().zweiteFunktion();

Ich hoffe es ist klarer geworden, was ich vorhabe,
Dankeschön.
 
Schau dir mal das Konzept der Prototypen in Javascript an.

Die übliche Vorgehensweise ist da in etwa so:
PHP:
function foo() {
   this.arr = [10,20];
}
foo.prototype.bar = function(){
  var arr = this.arr;
  arr.push(30);  //arr erweitern
  return arr;
};
var foo = new foo;
var arr = foo.bar();
alert(arr);  //10,20,30

In Javascript ist alles Mögliche machbar. So kann ich an eine Funktion wieder eine Funktion anhängen und so auch die Werte welche per return geliefert werden verarbeiten.
Aber nicht alles was funktionert ist unbedingt empfehlenswert.
PHP:
function foo() {
   return [10,20];
}
foo.bar = function(){
  var arr = this();
  arr.push(30);  //arr erweitern
  return arr;
};
var arr = foo.bar();
alert(arr);  //10,20,30

Zum probieren: jsfiddle

LG jspit
 
Die zweite Funktion soll an die erste angehangen werden und kriegt den Return mit
Generisch ist sowas in JS mit
Code:
zweiteFunktion(ersteFunktion());
machbar - ist aber schlecht zu lesen. Prinzipiell kannst du nicht eine beliebige Funktion über den "."-Operator aufrufen - von welcher Programmiersprache kommst du denn, wo so etwas möglich ist?
 
Schonmal Danke für eure Antworten. Ich habe wohl einen wichtigen Aspekt vergessen, denn ich arbeite mit jQuery und dachte, die Punkt-Notation sei auch im "Standart" JS so zu finden, also sieht meine erste bzw. zweite Funktion so aus :

Code:
function ersteFunktion() {
   var eins = $('#eins');
   var zwei = $('#zwei');

   ...

  return [eins, zwei];
}

jQuery.fn.extend({
   zweiteFunktion: function() {
      var eins = $(this[??]);
      var zwei = $(this[??]);
   }
});

ersteFunktion().zweiteFunktion();
 
jQuery gibt aber immer ein jQuery-objekt zurück. deswegen kannst du die funktionen so endlos lange verketten.
das kannst du selbst auch so realisieren. du musst dir ein objekt erstellen, alle deine funktionen als objekt-methoden an dieses objekt legen und immer ein solches objekt zurückgeben
 
Ah... du arbeitest mit fn.extend - das erklärt den Ansatz.

Aber warum machst du dann deine erste Funktion nicht so:
Code:
   var ret = $('#eins, #zwei');

   ...

  return ret;
- dann hast du ein jQuery-Objekt mit beiden Nodes drin (falls die existieren).

die Punkt-Notation sei auch im "Standart" JS so zu finden
Die kommt vom Standard.
 
Danke für deine Antwort, die Lösung funktioniert auch ganz gut, jedoch liefert mir "this" immer nur die erste Variable zurück, also '#eins', wie kann ich nun auf '#zwei' zugreifen ?
 
AW: Mehrfach Return mit "this" abgreifen

Es sollte auch $(this) heißen, pardon.

- - - Aktualisiert - - -

Habe bisher selber noch keine Lösung auf das Problem des Zugriffs auf die zweite Variable gefunden und würde mich über Hilfe freuen.
Dankeschön.
 
Also bei mir funktioniert this:
Code:
<!DOCTYPE html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Fenstertitel</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<style type="text/css"></style>
</head>
<body>
<div id="eins"></div>
<div id="zwei"></div>
<script type="text/javascript">
function a(){
	return $("#eins, #zwei");
}
function b(){
	console.log(this);
	alert(Array.prototype.map.call(this, function(el){return el.id;}).join(", "));
}
jQuery.fn.extend({b: b});

a().b();
</script>
</body>
</html>
 
Danke für deine Antwort kkapsner, so weit war ich jedoch auch schon, meine Frage ist, wie kann ich ein einzelnes Element ansprechen, so kriege ich ja z.B. nur die ID's von beiden Elementen.
 
Code:
alert(Array.prototype.map.call(this[0], function(el){
		return el.id;
	}));

bzw.

Code:
alert(Array.prototype.map.call(this[1], function(el){
		return el.id;
	}));

Funktioniert bei mir, der alert bleibt leer.

Wenn ich
Code:
alert(this[0])
Alleine stehlen lasse, wird noch nicht mal ein Pop-Up Aufgrund eines Fehler angezeigt.
 
Ich habe nun endlich das Problem, dass bei meiner Version besteht, gefunden. Und zwar benutzt du in deinem "return" die "Textversion", ich habe die Elemente vorher in Variablen gespeichert, sieht also so aus :
Code:
return $("#eins, #zwei");
Meine Version
Code:
var eins = $("#eins")
var zwei = $("#zwei");
return $(eins, zwei);
Der Unterschied ist nun, dass das Kommata nicht mehr in Anführungszeichen steht und dies verursacht den Fehler, dass die zweite Variable bei meiner Version nicht existiert. Nun stellt sich mir die Frage, wie ich dieses kleinere Problem beheben kann und trotzdem meine Variablen benutzen kann, da dies für mich unabdingbar ist...
 
Zuletzt bearbeitet:
Zurück
Oben