Proposal: opt-out local scoping

Brendan Eich brendan at
Thu Aug 28 12:47:39 PDT 2008

On Aug 28, 2008, at 12:14 PM, Dave Herman wrote:

> I interpreted Erik's point to be that the binding of `this' is not
> lexically scoped, so it would be useful to have a lexically scoped
> variable initially bound to the global object. IOW, if I write:
>      this.print("blah blah blah")
> and then I refactor the code to say:
>      (function() {
>          this.print("blah blah blah")
>      })()
> it breaks.

It happens not to break, because ES3 requires a null |this| for such  
calls, where the null is later replaced by the global object.

obj = {
     method: function () { this.print("blah blah blah"); },
     print:  function () { print("not the print you want"); }

would break, though.

We've been trying to fix the ES3 null->global rule for a while. Any  
change is an incompatible change, but the current rule leads to  
unintended global mutation and capture bugs.

> By contrast if I have a standard library binding `global'
> that's bound to the same thing as `this' at the top level, then I  
> can write:
>      global.print("blah blah blah")
> and the same refactoring:
>      (function() {
>           global.print("blah blah blah")
>      })()
> continues to work the same. But there's no need for a special  
> keyword or
> anything like that.

Indeed, Doug Crockford proposed at the January TC39 meeting this year  
to make 'this' act like a lexically bound variable, with the only  
magic to it applying to the case of obj.method() call expressions  
(and variatons, obj[name] where name = 'method'), where 'this' would  
be overridden -- if you will, a shadowing 'this' would be bound to obj.

I liked Doug's proposal quite a bit. I do not see anything like it in  
ES3.1, but I'd like to see it in Harmony.


More information about the Es-discuss mailing list