Thx a lot for helping me visualize it! On Sun, Feb 24, 2008 at 11:08 AM, Andrew Dupont <[EMAIL PROTECTED]> wrote:
> > > > On Feb 24, 1:31 am, "Manu Temmerman-Uyttenbroeck" > <[EMAIL PROTECTED]> wrote: > > The basic example onhttp://prototypejs.org/api/ajax/requestalso has a > > closure, because the onSuccess callback function is defined inline, > correct? > > So if that 'new Ajax.Request' is in a function, then that url variable > will > > not be released until that ajax request successfully finishes and that > > onSuccess function runs? > > What happens then when the ajax request is not successfull and throws an > > exception. That url value will stay in memory until you navigate away > from > > the page? > > Unless the request object itself gets dereferenced. > > If I'm inside a function and I say... > > var foo = new Ajax.Request(/*...*/); > > ... then once the function goes out of scope, I won't be able to > obtain a reference to it again. (This is assuming that variable isn't > a part of *some other* closure created inside the function. The > browser knows this, so when the request has completed its life-cycle > (even by throwing exception), it'll GC the object if nothing > references it. And that would also GC the closure formed by attaching > that anonymous function to the object. > > Now, if I say... > > window.foo = new Ajax.Request(/*... */); > > ... then I've set a global reference that will never go out of scope. > That means my request object won't be GC'ed unless I explicitly > dereference later on (window.foo = null). > > Let's make a diagram. Think of "window" (the global scope) as a big > circle in the middle of the page. Imagine everything -- strings, > numbers, objects, etc. -- as nodes. Now draw lines between nodes to > make references. (window connects to Ajax, Ajax connects to > Ajax.Request, etc.) > > Anything that can be traced back to "window" must be kept in memory. > If I remove a reference to something, that erases a line from the > diagram, and any resulting "node island" can be GC'd. Even if you've > got two objects that reference one another, if neither one of them can > be referenced from the global scope, they can be purged from memory, > since it's impossible to refer to them. > > (Of course, IE has its own problem with circular references, which > brings me to your next question...) > > > > What happens when you didn't only store a url string, but let's say a > > reference to a collection of 200 dom objects and the ajax request fails. > > Circular reference? Meaning a 'real' memory leak. That memory won't be > > released even after navigating away from the page. > > Yeah, and that's the sort of thing that can't easily be solved inside > the JS environment (except through cautious coding). Of course, IE7 > claims to have fixed many of those leaks, so maybe you should make a > test page and find out. ;-) > > Cheers, > Andrew > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Spinoffs" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs?hl=en -~----------~----~----~----~------~----~------~--~---
