Сценарий оболочки “для” синтаксиса цикла

Я занес приблизительно в блог производительность в браузере некоторое время назад, но позволил мне суммировать те связанные с DOM для Вас здесь.

  • Обновление DOM максимально нечасто. Внесите свои изменения в Объекты DOM в оперативной памяти и добавьте их только однажды к DOM.
  • Использование innerHTML. Это быстрее, чем методы DOM в большинстве браузеров.
  • делегация события Use вместо регулярной обработки событий.
  • Знают, какие вызовы являются дорогими, и избегают их. Например, в jQuery, $ ("div.className") будет более дорогим, чем $ (" #someId").

Тогда существуют некоторые связанные с самим JavaScript:

  • Цикл как можно меньше. Если у Вас есть одна функция, которая собирает узлы DOM и другой, который обрабатывает их, Вы - цикличное выполнение дважды. Вместо этого передайте анонимную функцию функции, которая собирает узлы, и обработайте узлы, поскольку Ваш собирают их.
  • стандартная функциональность Использования, если это возможно. Например, forEach итераторы.
  • Использование setTimeout, чтобы позволить браузеру дышать время от времени.
  • Для дорогих функций, которые имеют идемпотентные выводы, кэшируйте результаты так, чтобы Вы не повторно вычисляли его.

еще существуют некоторые на моем блоге (ссылка выше).

182
задан Peter Mortensen 19 January 2018 в 12:08
поделиться

7 ответов

Расширение скобок, {x..y} выполняется перед другими расширениями, поэтому вы не можете использовать это для последовательностей переменной длины.

Вместо этого используйте метод seq 2 $ max как user моб заявил .

Итак, для вашего примера это будет:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done
222
ответ дан 23 November 2019 в 06:05
поделиться

Попробуйте версию с арифметическими выражениями для :

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

Это доступно в большинстве версий bash, а также должен быть совместим с Bourne shell (sh).

68
ответ дан 23 November 2019 в 06:05
поделиться

Пошаговое выполнение цикла вручную:

i=0
max=10
while [ $i -lt $max ]
do
    echo "output: $i"
    true $(( i++ ))
done

Если вам не нужно полностью использовать POSIX, вы можете использовать арифметику для цикла :

max=10
for (( i=0; i < max; i++ )); do echo "output: $i"; done

Или используйте jot (1) в системах BSD:

for i in $( jot 0 10 ); do echo "output: $i"; done
27
ответ дан 23 November 2019 в 06:05
поделиться

Есть несколько способов сделать это.

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
9
ответ дан 23 November 2019 в 06:05
поделиться

Если в вашей системе доступна команда seq :

for i in `seq 2 $max`
do
  echo "output: $i"
done

Если нет, то используйте seq для бедняков с perl :

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

Обратите внимание на эти кавычки.

9
ответ дан 23 November 2019 в 06:05
поделиться

Ну, поскольку в моей системе (Mac OS X v10.6.1 (Snow Leopard)) не была установлена ​​команда seq , я закончилось тем, что вместо этого использовался цикл while :

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* Shrugs * Все, что работает.

2
ответ дан 23 November 2019 в 06:05
поделиться

Используйте:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

Вы требуется явный вызов eval для повторной оценки {} после замены переменной.

1
ответ дан 23 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: