Замыкания и Джаваскрипт
Все знают, что зона видимости в 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» быть не умеет, но можно было бы и научить.
Если мне не изменяет память, конструкция «with» помечена как устаревшая и не рекомендуется к использованию.
Комментарий для alexey@beliy.pro:
Да. Вы так говорите, как будто это потому, что она реально устарела — износилась, плохо едет. Она помечена, потому что плохо продумана и никто не задумывается чем она ещё может быть полезна, кроме того для чего была придумана.
Комментарий для Евгения Степанищева:
Только область видимости не создаётся, а перекрывается (на чтение) подсунутым объектом.
Я, наверное, пост совсем не понял.
Комментарий для boltai-shaltai:
А я ваш комментарий не понял. С чем вы спорите-то? Ну да, with позволяет делать то, что я написал выше, иначе как бы я это сделал? Но то, что я предлагаю, никто не использует, хотя «все знают», да.
Насколько я помню, она помечена как устаревшая потому, что с ней очень плохо работают браузерные оптимизаторы. Они её попросту пропускают, в итоге код становится менее эффективным.
Комментарий для Сергей:
Вероятнее браузерные оптимизаторы плохо с ней работают, потому что конструкция плохая. А плохая она потому что она очень уж неявная: если в указанном объекте свойства нет, то берётся свойство window. Но её можно использовать иначе, я написал как и ещё, кстати, показывал как можно вызвать анонимную функцию через неё же: http://bolknote.ru/all/3643/
Тем говорит, что with плохо, но не в курсе почему.
Один из основных аргументов против with — непредсказуемость работы с переменными внутри него (объект может содержать свойство). В данном случае полностью контролируется список свойств объекта, и аргумент теряет свою актуальность.