JavaScript setTimeout 无递归无限循环
Posted
技术标签:
【中文标题】JavaScript setTimeout 无递归无限循环【英文标题】:JavaScript setTimeout infinite loop without recursion 【发布时间】:2019-01-27 22:04:01 【问题描述】:我不能使用 Obfuscator.io 来丑化我的 JS 脚本,因为它在调用自身的函数中包含 setTimeout
。MCVE:
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)