Бесконечный цикл JavaScript setTimeout без рекурсии

Я не могу использовать Obfuscator.io, чтобы исказить свой JS-скрипт, поскольку он содержит setTimeout внутри функции, которая вызывает сама себя.
MCVE:

function repeater() {
    // DO SOME STUFF...
    setTimeout(repeater, 100);
}
repeater();

Для воспроизведения требуются пользовательские настройки обфускации:
- Генератор имен идентификаторов: Mangled
- Зарезервированные имена: $ - jQuery

Сообщение об ошибке в Obfuscator.io:

Ошибка: ошибка @postConstruct в классе t: ошибка @postConstruct в классе t: превышен максимальный размер стека вызовов

Я прочитал несколько других вопросов о переполнении стека по этому поводу. Я понимаю, что вызов setTimeout(func) внутри func не на самом деле рекурсия.

Тем не менее, алгоритм Obfuscator.io не справляется с самовызывающейся задержкой setTimeout.

Как мне сделать многократно выполняющуюся функцию, используя setTimeout, не вызывая ее в самой функции? Я не хочу использовать setInterval, потому что хочу, чтобы задержка начиналась каждый раз после запуска кода функции. setInterval игнорирует это.


person clickbait    schedule 21.08.2018    source источник
comment
Вставка данного кода на сайт не приводит к данной ошибке.   -  person t.niese    schedule 21.08.2018
comment
Добавление insert into Obfuscator.io to reproduce issue жирным шрифтом не помогает. Как я уже сказал, вставка кода в obfuscator.io работает хорошо. Результат, например. function _0x19c7c5(){setTimeout(_0x19c7c5,0x64);}_0x19c7c5(); или больший код в зависимости от настроек. Но мне не удалось найти ни одной настройки, выдающей данную ошибку, ни при обфускации, ни при запуске полученного кода.   -  person t.niese    schedule 21.08.2018
comment
Попробовал снова с tranform object keys... И он все еще работает нормально (поскольку в вашем фрагменте кода нет объекта, это нормально, чтобы не заметить никакой разницы).   -  person Louys Patrice Bessette    schedule 21.08.2018
comment
По-прежнему нет никакой разницы с опцией mangled в генераторе имен идентификаторов... Работает нормально.   -  person Louys Patrice Bessette    schedule 21.08.2018
comment
Я полагаю, вы пытаетесь запутать очень сложный фрагмент кода... Проблема, безусловно, существует. Попробуйте проверить этот код здесь.   -  person Louys Patrice Bessette    schedule 21.08.2018
comment
@LouysPatriceBessette Даже простой пример в этом вопросе заставляет Obfuscator.io выдавать эту ошибку.   -  person clickbait    schedule 22.08.2018
comment
Если вы не установите $ в качестве зарезервированного имени, Obfuscator.io может запутать ваш код!   -  person FZs    schedule 24.08.2018
comment
@SallyCJ Вы должны нажать кнопку +, чтобы добавить зарезервированное имя.   -  person George    schedule 24.08.2018
comment
@ Джордж, спасибо, что указал на это. Неудивительно, почему я почувствовал, что что-то не так, когда я набрал «$» в поле.. xD   -  person Sally CJ    schedule 24.08.2018
comment
Я просто установил ваши пользовательские настройки обфускации, необходимые для воспроизведения, а затем по умолчанию код (не ваш код) получил некоторую ошибку. Значит у вас неверные настройки! Нет вашего кода.   -  person morteza ataiy    schedule 28.08.2018
comment
какое у тебя имя @clickbait? Почему бы вам не использовать вместо этого функцию setInterval()?   -  person Kiran Shakya    schedule 30.08.2018
comment
@KiranShakya Последний абзац объясняет, почему   -  person clickbait    schedule 30.08.2018


Ответы (2)


Я думаю, что ваша проблема на самом деле в использовании

  • Зарезервированные имена: $ — jQuery

как использование этого, поскольку конфигурация приводит к этому

введите здесь описание изображения

Это то, что вы получаете, если вы измените его на ^$, что и должно быть в текстовом поле и описании на веб-сайте, ваш код отлично запутывается.

введите здесь описание изображения

Зарезервированные имена

Отключает обфускацию и генерацию идентификаторов, которые сопоставляются переданными шаблонами RegExp.

Например, если вы добавите ^someName, обфускатор гарантирует, что все переменные, имена функций и аргументы функций, начинающиеся с someName, не будут искажены.

person George    schedule 24.08.2018
comment
или использовать jQuery вместо $, чтобы избежать этого конфликта? - person Ggg; 24.08.2018

Я это у вас что-то вроде этого:

function repeater() {
    // DO SOME STUFF...
    const someCodeInJQuery = $('#someId')
    setTimeout(repeater, 100);
}
repeater();

Просто нужно изменить на:

function repeater() {
    // DO SOME STUFF...
    const someCodeInJQuery = jQuery('#someId'); // Pay attention here
    setTimeout(repeater, 100);
}
repeater();

Ответ: измените $ на jQuery в своем коде, потому что обфускатор зарезервировал слова

Рекомендация: лучший способ - использовать uglifyJS вместо обфускатора

person аlex dykyі    schedule 30.08.2018