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

Reply via email to