在Chrome调试器中,是否有引用匿名函数块中的数据或函数的方法



我正试图在客户网站上实时调试一些东西,我的代码都在一个匿名函数块中。我不知道是否有任何方法可以访问代码来执行函数或查看其中的变量。我也不能设置断点,因为每次刷新页面时都会动态生成此代码,并且断点不会一直存在。

(function() {
var Date = "14 September 2022 14:44:55"; // different every refresh for example
var Holder = {
var Items = {
item1: "Value1",
item2: "Value2"
};
function getItem(name) {
return Items[name];
};
function setItem(name, value) {
Items[name] = value;
};
setTimeout(DoSomething(), 2000);
})();

这不是实际的代码,只是一个简单的例子来说明这个问题。

是否存在获取getItem((或Items的方法?

如果没有一个断点,代码可能会运行到完成,然后POOF,一切都会消失。

重新定义setTimeout

如果匿名函数中的代码真的调用了其他浏览器方法,那么您可以在运行时插入一个迂回路径,然后在其上设置断点

为了实现这一点,您需要能够在匿名代码之前将新代码注入页面,因为没有其他方法可以调用IIFE。

您的示例代码使用setTimeout,因此我将尝试插入以下内容:

let realSetTimeout = window.setTimeout
window.setTimeout = (...args) => {
debugger
return realSetTimeout(...args)
}

许多不相关的代码可能正在调用setTimeout,在这种情况下,这可能会破坏页面或使调试变得非常乏味。在这种情况下,如果setTimeout参数之一具有示例中使用的值,例如:,则可能只进行调试

// only break for our timeout
if(args[1] === 2000) debugger

类似的事情可能不会只触发您的代码,但它会极大地减少其他代码路径的数量,这些路径在通过常用浏览器功能的过程中会被中断。


或者,在HTML页面进入浏览器之前,使用Charles Proxy重写其正文。您可以手动将debugger调用直接插入到匿名函数中。查尔斯不是免费的,但我认为他们有一个演示可以让你这样做。如果你专业地做这件事,这可能是一笔不错的购买。你的雇主甚至可能会为执照付费。

如果你不能使用Charles(或类似的工具(,你可以使用Node来设置一个本地代理服务器,它会为你重写。这样的事情可能只需要一个小时就可以完成。但这是一项更大的任务,如果你需要帮助的话,这也值得问。

没有。

匿名对象内部的变量是在外部无法访问的范围内创建的。

使用闭包的主要好处之一!

您必须找到一种方法,通过修改生成这些对象的函数,在其中插入您自己的代码。如果你不能做到这一点,那么你就必须走岔路口,另辟蹊径。

最新更新