jobo: pass by reference - verständnisproblem - gelöst

Beitrag lesen

Hallo Matthias,

Du rufst once() hier zweimal auf. once gibt jeweils eine Funktion zurück, die man nur einmal nutzen kann. Sie wrappt dazu die übergebene Funktion.

Ok, jetzt ist der Groschen offenbar gefallen.

var once_storer = once(storer(my_object, 'blah'));

once_storer("fourthInput");
alert(my_object.blah); //fourthInput

once_storer("fifthInput"); // Exception


>   
> Das geht natürlich nicht, weil die Wrapper-Funktion das verhindert.  
>   
  
Fein.  
  

> Deine Beispiele sind auch etwas gestellt.  
  
Die Codeschnipsel stammen alle aus dem Vortrag und sind auf der [Yahooseite](http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-5) nicht transkribiert, dafür bei [slideshare](http://www.slideshare.net/douglascrockford/crockford-on-javascript-part-5-the-end-of-all-things).  
  
  

> Crockford redet von asynchronen Callbacks z.B. bei Ajax, beim Abarbeiten von Listen oder einfach dem Ausführen verschiedener Aufgaben hintereinander. do\_it() macht also nur Sinn, wenn es einen Payload hat, der ausgeführt wird, bevor das Ergebnis an die Callback-Funktion weitergegeben wird (in deinen Beispiel ist es nur ein unnötiger Wrapper).  
  
Ja, offenbar falsch die Beispiele zusammengestellt.  
  

> Dazu beschreibt er die Möglichkeit, Callbacks funktional zu erzeugen, sodass sie gemäß dem »object capability security system« Zugriff auf die nötigen Daten »by introduction« haben und auf keine sonstigen Daten.  
  
Ja, das Grundprinzip war mir schon eingängig. do\_it ist nur da, um es zu "machen", der "dispatcher" vielleicht. Es weiß nur, wem es den Result übergeben muss. "Pack das Ding da rein" ist seine Aufgabe. Es weiß nicht, woher "das Ding" kommt und auch nicht, was "da drin" damit passiert.  
  

> Es geht hier um die Trennung von Aufgaben und damit die Trennung von Zugriffsrechten, deshalb betont er ständig »none of this is do\_it's business«. In dem Zusammenhang soll die Ausführung von Callbacks durch das wrappen mit once() limitiert werden. Das ist eben weder die Aufgabe von do\_it noch des Callbacks an sich. Wichtig ist hier, dass do\_it keinen direkten Zugriff auf den Callback hat.  
  
Genau.  

>  (technisch gesehen in deinen Beispielen schon, aber das soll eben vermieden werden).  
  
Weil ich nicht wie Du erläuterst, eine Instanz der Funktion erzeugt habe.  
  

>  Es bekommt nur die Wrapper-Funktion übergeben. Und diese kann eben nur einmal ausgeführt werden.  
  
Danke vielmals. Ich dachte schon, dass das eine zentraler Punkt ist, wenn Crockford das auch explizit so voranführt:  
  
"It's important to understand this because people often get confused between values and variables and misunderstand what their relative goals are...". Und das Verständnis der Sicherheit, die sich aus seiner Sicht ja im Grunde mit Javascript selbst erzeugen lässt, basieren ja darauf: "This is a really important thing to understand about the language because all of the security properties we're going to talk about later derive from this."  
... " JavaScript gets beat up for its security problems, but it is actually closer to being a secure language than virtually any other language out there. You just have to recognize the pattern and make it work."  
  
Gruß  
  
jobo