Локальные переменные и JS

Читал тут по диагонали стандарт ECMAScript и подумалось мне, что сэмулировать локальные переменные (да, я осознаю, что это свойства объекта) можно вот так:
var a = 10;
with ( { a : 20 }) {
    alert(a);
}
alert(a);
Ожидаемый результат: сначала код выведет «20», потом — «10». Я ещё не задумывался над тем насколько это практично и изящно, просто придумалось.

Кстати, обратите внимание, что следующий код выведет «30», «30», «10», «30»:
var a = 10, b = 10;

with ({a:20}) {
    var a = 30, b = 30;
    alert(a);
    alert(b);
}

alert(a);
alert(b);
Добавлено 10 ноября 10:55: в комментариях почему-то подумали, что я не знаю о лексических замыканиях. Знаю, конечно.
9 ноября 2009 23:07

Александр Бабаев (bealex.moikrug.ru)
10 ноября 2009, 01:19

Вот это сегодня задавало мне тон всего дня http://zw0rk.blogspot.com/2009/11/blog-post_08.html. И данная заметка — в похожую степь попала. Тоже "просто придумалось" :)

Alisey (alisey.myopenid.com)
10 ноября 2009, 08:41

var a = 1, b = 2;

(function(){
   var a = 11, b = 22;
   alert(a);
   alert(b);
})();

alert(a);
alert(b);

Если бы это было встроенной возможностью языка, то было бы практично и изящно.
Если бы так например:
a = 10;
{ a = 5; alert(a); }
alert(a);

bolk (bolknote.ru)
10 ноября 2009, 09:54, ответ предназначен Alisey (alisey.myopenid.com):

Ну конечно я знаю что такое замыкание :) Мне даже кажется, что я знаю в деталях как они работают в JS :)

bolk (bolknote.ru)
10 ноября 2009, 09:54, ответ предназначен Александр Бабаев (bealex.moikrug.ru):

Забавная штука, хотя сделать её куда проще, чем «классику» :)

Alisey (alisey.myopenid.com)
10 ноября 2009, 10:45, ответ предназначен bolk (bolknote.ru):

Ну, я ничего не думал в комментариях. Мне просто with не нравится с тех пор, когда упаковщики JS не могли его правильно обрабатывать. И вообще with как-то неприятен для тела, не могу сформулировать.

bolk (bolknote.ru)
10 ноября 2009, 13:35, ответ предназначен Alisey (alisey.myopenid.com):

Да я понимаю чем он неприятен — никогда толком не знаешь что внутри происходит :) Если в объекте нет какого-то свойства, то случайно можно попасть в переменную. Вот в VBScript куда лучше сделано, там всё, что ты хочешь получать из with начинается с точки (т.е. слева от точки пробельный символ, а справа — имя): «.property».

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)