Локальные переменные и 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: в комментариях почему-то подумали, что я не знаю о лексических замыканиях. Знаю, конечно.

Поделиться
Отправить
6 комментариев
Александр Бабаев (bealex.moikrug.ru)

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

Alisey (alisey.myopenid.com)

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);

Евгений Степанищев (bolknote.ru)

Комментарий для alisey.myopenid.com:

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

Евгений Степанищев (bolknote.ru)

Комментарий для bealex.moikrug.ru:

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

Alisey (alisey.myopenid.com)

Комментарий для Евгения Степанищева:

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

Евгений Степанищев (bolknote.ru)

Комментарий для alisey.myopenid.com:

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

Популярное