making |this| an error (was Re: for own(...) loop)

John J Barton johnjbarton at johnjbarton.com
Wed Nov 9 07:10:25 PST 2011


On Wed, Nov 9, 2011 at 3:41 AM, David Bruant <bruant.d at gmail.com> wrote:
> Le 09/11/2011 02:26, Andrew Paprocki a écrit :
>>
>> On Tue, Nov 8, 2011 at 6:36 PM, Brendan Eich<brendan at mozilla.com>  wrote:
>>>
>>> Ignoring performance, a lot of stylish JS hackers use
>>> Object.keys(o).forEach. How many run into the wrong |this|
>>> (arguments/break/continue/return)? Not clear. Something to study.
>>
>> I was curious so I did some grok-ing across my code sample and
>> Object.keys() is barely used. The usage of the |for in| construct is 2
>> orders of magnitude larger than the usage of hasOwnProperty(),
>> supporting the thought that no one really does it the "right" way.
>>
>> The MDN page for Object.keys does not talk about |this| being wrong in
>> certain situations. If you could elaborate on that, it would be
>> helpful to know.
>
> The |this| differs between the body of a for-in and the argument callback in
> the .forEach. Nothing to do with Object.keys. .forEach has a second optional
> argument which is the value to be used as |this| so that you don't have to
> do a .bind.

I'm sure this has been discussed before, but isn't is possible and
desirable to make |this| illegal in "using strict;" when it can be
determined from the AST alone that |this| will bind to |window|?  eg:

   Object.keys(foo).forEach(function(key) {
     // this is undefined-> window
   });

This case kind of case is because, as others have noted, incorrect
|this| binding most often occurs in two cases: 1) mixed OO and
functional programming (as above) and 2) callback defn.

Perhaps it is harder to detect than I think.

jjb


More information about the es-discuss mailing list