There is no bug in V8. You should not use delete to detach your
listener: it destroys onreadystatechange and all hidden logic
associated with it.

Basically your sample reduces to:

var x = {
  set on(v) { this.on_ = v; },
  do_things: function () { this.on_(); }
};

function foo(cb) {
  x.on = cb;
  x.do_things();
}

foo(function () {
    console.log("I am the first callback!");
    delete this.on; // (1)
  });

foo(function () {
    console.log("I am the second callback!");
    delete this.on;
  });

This will print 'I am the first callback!' twice because delete
destroyed 'on' property together with it's setter, so on_ field is not
getting updated.

--
Vyacheslav Egorov


On Fri, Feb 25, 2011 at 8:12 PM, Luis <[email protected]> wrote:
> Google Chrome: 10.0.648.119 (Official Build 75907) beta
> V8: 3.0.12.24
>
> I have a problem where some identical calls to a function create
> different results, but the function makes no changes to the
> environment that should persist between calls or affect their results.
> Shouldn't the results be the same? I use an ECMAScript file 'test.es'
> and an XHTML file to load it (included at the end).
>
> Steps to produce this result:
> Load 'test.es' in Google Chrome.
> Open the JavaScript Console.
> Enter 'submit(client)' and read output 'fresh true'.
> Enter 'submit(client)' again and read output 'fresh false'.
>
> Observations:
> An anonymous closure the 'submit' function defines appears to retain
> the value variable 'fresh' binds to from a previous call. However,
> 'submit' sets 'fresh' and creates a new closure on each call.
> Moreover, both outputs read 'fresh true' when I replace 'client' with
> 'client0', so the behavior depends on some factor.
>
> Questions:
> Shouldn't the results for the identical calls be identical?
> Why are the results identical for calls to 'client0' and not 'client'?
> Is this a bug?
>
> test.es:
> function submit(client) {
>    var fresh = true, uri = '';
>    client.fetch(uri,
>                 function () {
>                     console.debug('fresh', fresh),
>                     fresh = false,
>                     delete this.onreadystatechange;
>                 });
> }
> var client = new XMLHttpRequest, client0 = {fetch : function (uri,
> continuation) {var self = this;
>                                                                               
>    setTimeout(function () {continuation.call(self);}, 0);}};
> if (!client.DONE)
>    XMLHttpRequest.prototype.DONE = 4;
> client.fetch = function (uri, continuation) {
>    /* sets this to request resource at uri and dispatch continuation
> on acquisition
>       a continuation error forces continued request until
> continuation succeeds or a fatal error occurs */
>    this.onreadystatechange = function (event) {
>        if (this.readyState == this.DONE) {
>            try {continuation.call(this, event);}
>            catch (error) {
>                if (error.fail)
>                    this.requestURI(uri);
>                else
>                    debugger;
>            }
>        }
>    },
>    this.requestURI(uri);
> },
> client.requestURI = function(uri) {
>    this.open('GET', uri),
>    this.send();
> };
>
> The XHTML file:
> <html xmlns='http://www.w3.org/1999/xhtml'>
>  <head>
>    <meta http-equiv='Content-Script-Type' content='application/
> ecmascript' />
>    <script src='test.es' type='application/ecmascript' />
>  </head>
>  <body />
> </html>
>
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
>

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to