JavaScript setTimeout 无递归无限循环

Posted

技术标签:

【中文标题】JavaScript setTimeout 无递归无限循环【英文标题】:JavaScript setTimeout infinite loop without recursion 【发布时间】:2019-01-27 22:04:01 【问题描述】:

我不能使用 Obfuscator.io 来丑化我的 JS 脚本,因为它在调用自身的函数中包含 setTimeoutMCVE:

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

repeater();

重现所需的自定义混淆设置: - 标识符名称生成器:Mangled - 保留名称:$ - jQuery

Obfuscator.io's 错误信息:

错误:t 类中的@postConstruct 错误:t 类中的@postConstruct 错误:超出最大调用堆栈大小

我已经阅读了其他一些关于此的 Stack Overflow 问题。 I understand that calling setTimeout(func) inside func is not actually recursion.

但是,Obfuscator.io's 算法仍然无法处理自调用 setTimeout 延迟。

如何使用setTimeout 创建一个重复执行的函数而不在函数本身中调用它? 我不想使用setInterval,因为我希望每次在函数代码运行后开始延迟。 setInterval ignores that.

【问题讨论】:

在网站上插入给定的代码不会导致给定的错误。 以粗体字添加insert into Obfuscator.io to reproduce issue 无济于事。正如我所说,将代码插入 obfuscator.io 效果很好。结果是例如function _0x19c7c5()setTimeout(_0x19c7c5,0x64);_0x19c7c5(); 或更大的代码,具体取决于设置。但我无法找到产生给定错误的设置,无论是在混淆时,还是在运行结果代码时。 tranform object keys 再次尝试...它仍然可以正常工作(因为您的代码块中没有对象,所以注意到没有区别是正常的)。 @LouysPatriceBessette 即使是这个问题中的简单示例也会导致 Obfuscator.io 抛出该错误。 @SallyCJ 您必须单击+ 按钮才能添加保留名称 【参考方案1】:

我认为你的问题实际上是在使用

保留名称:$ - jQuery

使用它作为配置结果

你得到的是什么,如果你把它改成 ^$ 这就是网站上的文本框和描述应该是什么,你的代码混淆了

保留名称

禁用标识符的混淆和生成,这些标识符与传递的 RegExp 模式匹配。

例如,如果您添加 ^someName,混淆器将确保所有以 someName 开头的变量、函数名和函数参数都不会被破坏。

【讨论】:

或者使用 jQuery 而不是 $ 来避免这种冲突?【参考方案2】:

我这个你有类似的东西:

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();

Anwer:在代码中将 $ 更改为 jQuery,因为混淆器有 保留字

推荐:最好的方法-使用uglifyJS而不是混淆器

【讨论】:

以上是关于JavaScript setTimeout 无递归无限循环的主要内容,如果未能解决你的问题,请参考以下文章

javascript setTimeout 和递归函数执行流程

带有计时事件的 JavaScript 递归 (setTimeout)

解决 js setTimeout 传递带参数的函数无效果

JavaScript中的递归异步函数

请简述一下settimeout和setinterval的区别,其中包括内存方面的分析前端

javascript 递归函数调用(recursive funciton call)