On 2010-02-05, at 17:25, Brendan Eich wrote:

> On Feb 5, 2010, at 2:14 PM, P T Withington wrote:
> 
>> ({
>> 'foo': 20,
>> 'test': function () {
>>   var f = function () {
>>     alert("foo:"+ foo);
>>     alert("this.foo:"+ this.foo);
>>     alert("bar:"+ bar);
>>   }
>>   with (this) {
>>     var foo = 42;
>>     var bar = 21;
>>     f.call(this);
>>   }
> 
> "Doctor, it hurts when I use 'with' in JavaScript!"

Indeed!

>> }
>> }).test();
>> 
>> --
>> 
>> By my reading, `foo` and `bar` are declared and initialized in `test`, and 
>> closed over by `f`.  I expect to see:
>> 
>> foo:42
>> this.foo:20
>> bar:21
>> 
>> But in Rhino, Firefox, Safari and Opera I am seeing:
>> 
>> foo:undefined
>> this.foo:42
>> bar:21
> 
> This is correct. The vars are hoisted but the initialization of foo puts 42 
> where it found foo on the scope chain, in this.foo. There's no 'bar' property 
> in |this| so that goes in the var.

Interesting!  I couldn't convince myself that var hoisting would be quite so 
literal.

>> Flash 10 gives me the answer I expected.  I have not tested other JS engines.
> 
> Flash 10 bug.

I will report.  Thanks.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to