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