Что вы думаете об этом использование цикла for в JavaScript?


Алгоритм, который я должен был написать это идеальный случай Для время, или do..while цикл, однако я узнал, что если я это реализовать с помощью цикла for Я сэкономить несколько строк кода, а также область действия переменных будет более уместным. Взгляните на следующий код:

        for ( var i = 1, offset = -1; currentPosition.top === fakePosition.top && offset !== 0; i++ ) {
            fakePosition.top -= i * 10;
            offset = this.documentView.getOffsetFromPosition( fakePosition );
            fakePosition = this.documentView.getRenderedPosition( offset );
        }

Как видите, второй параметр является очень нетипичным как для циклов. Моя причина, чтобы переключиться на этот цикл было то, что мне нужно итератор (I) и смещения переменных внутри цикла (и только там).

Что вы думаете о таком подходе?



251
2
задан 21 октября 2011 в 07:10 Источник Поделиться
Комментарии
2 ответа


Как видите, второй параметр является очень нетипичным как для циклов

Который является, почему это не должно быть для петли, потому что, как вы пишите сами(!) "[это] является идеальный случай Для время, или do..while цикл". Сэкономив несколько строк кода и область видимости переменной-это не веская причина, чтобы скрыть код. Вы будете (или должны) быть потери воспринимаемого времени/прибыли строка в письменной форме замечаний необходимым объяснить свой обман. Если вы хотите ограничить область видимости переменной, объявите новые возможности или функции.

Как @Raynos намекает в комментариях, вы должны избежать "магии", точнее, сложные выражения в ваш цикл for (и другие условные операторы). Он не может выглядеть плохо к вам сейчас (хотя он, вероятно, в Х месяцев), но рассмотрим, что происходит, когда ваш босс или клиент просит вас, чтобы добавить поддержку для особого случая. Очень быстро она будет выглядеть вот так:

    for ( var i = 1, offset = -1; currentPosition.top === fakePosition.top && offset !== 0 && currentPosition.top != -1 /* browser XYZ gives bogus answer */ && offset < fakePosition.bottom /* handle condition explained in ticket #123 */; i++ ) {
fakePosition.top -= i * 10;
offset = this.documentView.getOffsetFromPosition( fakePosition );
fakePosition = this.documentView.getRenderedPosition( offset );
}

2
ответ дан 21 октября 2011 в 08:10 Источник Поделиться

То для команды это отлично подходит для простой петли, так как это делает код легче читать, когда цикл следует общей схеме. Для более сложных петель, которые вы потеряете это преимущество, так что вы должны использовать конструкцию, которая лучше описывает то, что петлю делает.


область действия переменных будет более уместным

Нет, это не так. Неважно, где в функции объявить переменную, объем всей функции.

Вы даже можете объявлять переменные ниже код, где вы используете его, они действительно будут созданы, когда вы входите в функцию. Пример:

function test() {
alert(x); // shows undefined
x = 42;
alert(x); // shows 42
var x;
alert(x); // shows 42
}

// global scope:
var x = 1337;
alert(x); // shows 1337
test();
alert(x); // shows 1337

1
ответ дан 21 октября 2011 в 09:10 Источник Поделиться