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