Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Логичность шаблона «объявили и вызвали» в JS

Вчера в комменариях возникло обсуждение семантики синтаксиса «!function () {}()». Мне так кажется, что семантика здесь побоку, использовать функцию для создания зоны видимости — уже костыль (в JS 1.7 есть конструкция «let» для этого), но мне тут подумалось, что ведь можно сделать эту конструкцию семантичной, если использовать забытую конструкцию «with»:

with (function () {
    // тело функции
}) call();

На мой взгляд, весьма и весьма семантично. Что скажете?

5 комментариев
art 2012

The with statement is forbidden in strict mode (see §5.7.3) and should be considered
deprecated in non-strict mode: avoid using it whenever possible. JavaScript code that
uses with is difficult to optimize and is likely to run more slowly than the equivalent
code written without the with statement.

David Flanagan — Javascript The Definitive Guide 6th Ed.

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

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

Это просто потому, что вот таким образом его ещё не использовали. С «with» действительно есть проблемы в общем случае. В частностях по-разному может быть.

PastorGL 2012

Остроумно на грани гениальности. Вполне достойно прямиком отправиться в комитет по стандартизации JS :)

ixth 2012

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

Боже, Евгений, объясните как это работает. call — это вызов метода?

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

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

Да, вызов метода функции (функция — объект в JS).