Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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

Все знают, что зона видимости в 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 2012

Если мне не изменяет память, конструкция «with» помечена как устаревшая и не рекомендуется к использованию.

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

Комментарий для alexey@beliy.pro:

Да. Вы так говорите, как будто это потому, что она реально устарела — износилась, плохо едет. Она помечена, потому что плохо продумана и никто не задумывается чем она ещё может быть полезна, кроме того для чего была придумана.

boltai-shaltai 2012

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

Конструкция with позволяет использовать для области видимости произвольный объект.

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

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

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

Комментарий для boltai-shaltai:

А я ваш комментарий не понял. С чем вы спорите-то? Ну да, with позволяет делать то, что я написал выше, иначе как бы я это сделал? Но то, что я предлагаю, никто не использует, хотя «все знают», да.

Сергей 2012

Насколько я помню, она помечена как устаревшая потому, что с ней очень плохо работают браузерные оптимизаторы. Они её попросту пропускают, в итоге код становится менее эффективным.

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

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

Вероятнее браузерные оптимизаторы плохо с ней работают, потому что конструкция плохая. А плохая она потому что она очень уж неявная: если в указанном объекте свойства нет, то берётся свойство window. Но её можно использовать иначе, я написал как и ещё, кстати, показывал как можно вызвать анонимную функцию через неё же: http://bolknote.ru/all/3643/

blog.podgorniy.net 2012

Тем говорит, что with плохо, но не в курсе почему.
Один из основных аргументов против with — непредсказуемость работы с переменными внутри него (объект может содержать свойство). В данном случае полностью контролируется список свойств объекта, и аргумент теряет свою актуальность.