W3C home > Mailing lists > Public > public-script-coord@w3.org > July to September 2012

Re: "var" declarations shadowing properties from Window.prototype

From: Cameron McCormack <cam@mcc.id.au>
Date: Sun, 12 Aug 2012 11:46:18 +1000
Message-ID: <50270AEA.6070207@mcc.id.au>
To: Brendan Eich <brendan@mozilla.com>
CC: Boris Zbarsky <bzbarsky@mit.edu>, public-script-coord@w3.org, es-discuss@mozilla.org
Brendan Eich:
> As bz and others point out, the object detection w/ var pattern can
> arise for operations, e.g. for requestAnimationFrame, using the same
>
>    var requestAnimationFrame = window.mozRequestAnimationFrame || ... ||
> window.requestAnimationFrame;
>
> pattern. So WebIDL operations (JS methods) on the global would be
> promoted to "own" too. They'd be configurable, if I recall correctly,
> and either writable or replaceable. Do I have that right?

OK.  So one thing that I think has been pointed out is that moving 
properties for operations on to window makes it harder to monkeypatch 
addEventListener and friends.  We *could*, if we thought it was 
important, have the properties on window forward on to the ones from the 
prototype.

Some other questions on specifics:

1. If we don't do that auto-forwarding, does Window.prototype still need 
to exist?  What should window.__proto__ be?

2. If Window.prototype still does exist, should it be empty?

3. The only writable IDL attributes on Window are:

      attribute DOMString name;
      attribute DOMString status;
      attribute WindowProxy? opener;

and all of the event handler attributes like "onclick".  How do these 
need to behave if script blithely tries to use variables of the same 
name?  With this:

   <script>
     alert([window.status, typeof window.status]);
     window.status = "hello";
     alert([window.status, typeof window.status]);
   </script>
   <script>
     var status;
     alert([window.status, typeof window.status]);
     status = 1;
     alert([window.status, typeof window.status]);
   </script>

Gecko and Opera alert:

   ,string
   hello,string
   ,undefined
   1,number

while Chrome and Safari alert:

   ,string
   hello,string
   hello,string
   1,string

which seems to indicate that they're setting the IDL attribute.  I guess 
this is related to whether we want "function onclick(){}" to invoke the 
setter.

With this:

   <body onerror="alert('exception')">
   <script>
     alert([String(window.onclick), typeof window.onclick)]);
   </script>
   <script>
     var onclick = 1;
     alert([String(window.onclick), typeof window.onclick]);
   </script>

Gecko, Opera and Chrome alert:

   null,object
   1,number

which could mean shadowing or treating "onclick" as IDL type "any" and 
treating non-Function values as null, while Safari alerts:

   null,object
   null,object

which looks like it's invoking the setter but ignoring the assignment of 
a non-Function value.
Received on Sunday, 12 August 2012 01:46:54 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 8 May 2013 19:30:06 UTC