Локальные переменные и 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: в комментариях почему-то подумали, что я не знаю о лексических замыканиях. Знаю, конечно.
Вот это сегодня задавало мне тон всего дня http://zw0rk.blogspot.com/2009/11/blog-post_08.html. И данная заметка — в похожую степь попала. Тоже «просто придумалось» :)
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);
Комментарий для alisey.myopenid.com:
Ну конечно я знаю что такое замыкание :) Мне даже кажется, что я знаю в деталях как они работают в JS :)
Комментарий для bealex.moikrug.ru:
Забавная штука, хотя сделать её куда проще, чем «классику» :)
Комментарий для Евгения Степанищева:
Ну, я ничего не думал в комментариях. Мне просто with не нравится с тех пор, когда упаковщики JS не могли его правильно обрабатывать. И вообще with как-то неприятен для тела, не могу сформулировать.
Комментарий для alisey.myopenid.com:
Да я понимаю чем он неприятен — никогда толком не знаешь что внутри происходит :) Если в объекте нет какого-то свойства, то случайно можно попасть в переменную. Вот в VBScript куда лучше сделано, там всё, что ты хочешь получать из with начинается с точки (т. е. слева от точки пробельный символ, а справа — имя): «.property».