js - нет логики почему цикл продолжает работать

есть совсем уж маленькей код:

 function SwapOrder(str){
   split=str.split("").reverse();
   string='';
   for(i=0;i<str.length;i+=2){
     string+=split[i+1]+split[i];
   }
   return string;
  }

история тянется еще из блокчейна btc, этот код переворачивает по своему строку, но вот не задача, решил я значит написать это на js, вроде все ок, но в итоге

for(i=0;i<11;i++)SwapOrder("1234567890");

в цикле этот код вовсе ведет себя странно, по факту я понял что цикл не останавливается (если i<12 ну или больше), просто бесконечно роботает и пожирает ресурсы cpu. помогите понять - это я такой тупой или это особенность языка.


Ответы (2 шт):

Автор решения: Aliero

Попробуй заменить в цикле i:

for(x=0;x<11;x++)SwapOrder("1234567890");

→ Ссылка
Автор решения: Bohdan Dratovannyi

Дело в области видимости итератора, SwapOrder помимо возврата строки оставляет не почищенным итератор i цикла что находится внутри функции(в случае приведённых вами данных i=10), после того как отрабатывает функция, во внешнем цикле отрабатывает инкрементация i, но единица добавляется не к 0, а уже к 10, и того получаем 11, если условие завершения цикла i<11 то цикл успешно завершается, i<12 в свою очередь позволит продолжить итерации, вызвать функцию, в ней опять отработает цикл, итератору i будет присвоено значение 10, дальше можно читать по кругу пока недоест.

как вариант можно ограничить область видимость с помощью let, либо давать разные названия переменным

for(i = 0;i < 12; i++)SwapOrder("1234567890");

function SwapOrder(str){
   split=str.split("").reverse();
   string='';
   for(let i = 0; i < str.length; i+=2){
     string+=split[i+1]+split[i];
   }
   return string;
  }
→ Ссылка