Подтвердить что ты не робот

"с" ключевое слово в javascript

Возможный дубликат:
Есть ли законные применения для JavaScript & rsquo; s "with" statement?

Недавно я обнаружил, что в javascript можно сделать что-то вроде следующего:

with document{
    write('foo');
    body.scrollTop = x;
}

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

В качестве альтернативы можно сделать что-то вроде этого:

var d = document;
d.write('foo');
d.body.scrollTop = x;

Есть ли ситуации, когда использование ключевого слова "с" оправдано?

4b9b3361

Ответ 2

Просто не используйте его: http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

Оператор JavaScript with должен был предоставить стенографию для записи повторяющихся обращений к объектам. Поэтому вместо написания

ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing = true;
ooo.eee.oo.ah_ah.ting.tang.walla.walla.bang = true;

Вы можете написать

with (ooo.eee.oo.ah_ah.ting.tang.walla.walla) {
    bing = true;
    bang = true;
}

Это выглядит намного приятнее. За исключением одного. Вы не можете сказать, посмотрев код, который будет изменен bing и bang. Будет ли изменен ooo.eee.oo.ah_ah.ting.tang.walla.walla? Или глобальные переменные bing и bang получат clobbered? Невозможно точно знать...

Если вы не можете прочитать программу и быть уверены, что знаете, что она собирается делать, вы не можете быть уверены, что она будет работать правильно. По этой причине следует избегать оператора with...

Ответ 3

Несмотря на то, что, несмотря на советы противников почти везде, я думаю, что есть использование для "с" . Например, я работаю над структурой модели домена для Javascript, которая использует символ подчеркивания во многом так же, как jQuery использует "$". Это означает, что без "с" у меня есть много подчеркиваний, разбросанных по моему коду способами, которые делают его менее читаемым. Здесь случайная строка из приложения с использованием рамки:

_.People().sort(_.score(_.isa(_.Parent)),'Surname','Forename');

тогда как с "с" это будет выглядеть как

with (_) {
    ...

    People().sort(score(isa(Parent)),'Surname','Forename');

    ...
}

То, что было бы действительно полезно, это версия для чтения только для чтения.

Ответ 4

Я бы не использовал его в производственном коде, потому что он неоднозначен, но есть альтернативное решение для решения закрытия цикла, используя with, чтобы имитировать привязку let, вот копия моего предыдущего ответа:

Альтернатива стандартным решениям закрытия с использованием функций внутри цикла for:

<a  href="#">blah</a><br>
<a  href="#">blah</a><br>
<a  href="#">foo</a><br>
<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
        for ( var i = anchors.length; i--; ) {
            var link = anchors[i];
            with ({ number: i }) {
                link.onclick = function() {
                    alert(number);
                };
            }
        }
    })();
</script>

Кредит nlogax за предоставление решения, которое я в значительной степени сорвал: Javascript печально известной проблемы с циклом?

Здесь стандартное решение:

<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
    for ( var i = anchors.length; i--; ) {
        var link = anchors[i];
        (function(i) {
            link.onclick = function() {
                alert(i)
            }
        })(i);
    }
    })();
</script>