簡體   English   中英

JavaScript setTimeout 無遞歸無限循環

[英]JavaScript setTimeout infinite loop without recursion

我不能使用Obfuscator.io來丑化我的 JS 腳本,因為它在調用自身的函數中包含一個setTimeout
MCVE:

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

重現所需的自定義混淆設置:
- 標識符名稱生成器: Mangled
- 保留名稱: $ - jQuery

Obfuscator.io 的錯誤信息:

錯誤:類 t 中的 @postConstruct 錯誤:類 t 中的 @postConstruct 錯誤:超出最大調用堆棧大小

我已經閱讀了其他一些關於此的 Stack Overflow 問題。 據我所知,調用setTimeout(func)func實際上不是遞歸。

但是, Obfuscator.io 的算法仍然無法處理自調用setTimeout延遲。

如何使用setTimeout創建一個重復執行的函數而不在函數本身中調用它? 我不想使用setInterval因為我希望每次在函數代碼運行后開始延遲。 setInterval忽略了這一點。

我認為你的問題實際上是在使用

  • 保留名稱: $ - jQuery

使用它作為配置結果

在此處輸入圖片說明

這就是你得到的,如果你把它改成^$這就是網站上的文本框和描述所說的應該是什么,你的代碼混淆得很好

在此處輸入圖片說明

保留名稱

禁用混淆和標識符的生成,這些標識符由傳遞的 RegExp 模式匹配。

例如,如果您添加^someName ,混淆器將確保以 someName 開頭的所有變量、函數名稱和函數參數不會被破壞。

我這個你有這樣的事情:

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而不是混淆器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM