Замыкания и Джаваскрипт

Все знают, что зона видимости в JS создаётся только внутри функций (если не брать в расчёт конструкцию «let» из JS 1.7):

var v = 5;

!(function() {
    var v = 6;
})();

alert(v); // будет 5

Я тут подумал, что ведь есть и второй способ (я как-то уже о нём упоминал, и хотя внутри происходят немного другие вещи, внешне выглядит похоже), который даже немного похож на вышеупомянутую конструкцию «let», вот сравните:

var x = 1, y = 0;

// конструкция «let», JS 1.7+
let (x = x+10, y = 5) {
    alert(x+y); // 16
}
alert(x+y); // 1

// конструкция «with»
with ({ x: x+10, y: 5 }) {
    alert(x+y); // 16
}
alert(x+y); // 1

Не так уж и много отличий, только выражением «with» быть не умеет, но можно было бы и научить.

Комментарии 7

alexey@beliy.pro № 1
Если мне не изменяет память, конструкция «with» помечена как устаревшая и не рекомендуется к использованию.
Евгений Степанищев (bolknote.ru) автор № 2
Да. Вы так говорите, как будто это потому, что она реально устарела — износилась, плохо едет. Она помечена, потому что плохо продумана и никто не задумывается чем она ещё может быть полезна, кроме того для чего была придумана.
boltai-shaltai № 3
Конструкция with позволяет использовать для области видимости произвольный объект.

— первая фраза первой ссылки в Яндексе. То есть именно для таких манипуляций и придумана.
Только область видимости не создаётся, а перекрывается (на чтение) подсунутым объектом.

Я, наверное, пост совсем не понял.

Евгений Степанищев (bolknote.ru) автор № 4
А я ваш комментарий не понял. С чем вы спорите-то? Ну да, with позволяет делать то, что я написал выше, иначе как бы я это сделал? Но то, что я предлагаю, никто не использует, хотя «все знают», да.
Сергей № 5
Насколько я помню, она помечена как устаревшая потому, что с ней очень плохо работают браузерные оптимизаторы. Они её попросту пропускают, в итоге код становится менее эффективным.
Евгений Степанищев (bolknote.ru) автор № 6
Вероятнее браузерные оптимизаторы плохо с ней работают, потому что конструкция плохая. А плохая она потому что она очень уж неявная: если в указанном объекте свойства нет, то берётся свойство window. Но её можно использовать иначе, я написал как и ещё, кстати, показывал как можно вызвать анонимную функцию через неё же: /all/3643
blog.podgorniy.net № 7
Тем говорит, что with плохо, но не в курсе почему.
Один из основных аргументов против with — непредсказуемость работы с переменными внутри него (объект может содержать свойство). В данном случае полностью контролируется список свойств объекта, и аргумент теряет свою актуальность.