由全局范围内的 Web 应用程序声明的全局变量

globals declared by a web application in global scope

本文关键字:声明 全局变量 应用程序 Web 范围内 全局      更新时间:2023-09-26

有没有办法找出Web应用程序在全局范围(窗口)中声明/注入的所有变量?我想从正文卸载的窗口中删除所有这些声明的内容,以便在选项卡关闭时释放它占用的内存。

这样做的理由:Firefox 为所有选项卡维护全局堆。因此,关闭选项卡不会占用内存。

这样做的理由:Firefox 为所有选项卡维护全局堆。因此,关闭选项卡不会占用内存。

你能提供引用吗?我敢肯定Firefox确实会在某个时候释放相关的内存。否则,它将很快成为无法使用的内存猪。

回答您实际提出的问题:您可以在加载应用程序之前在window上构建属性名称列表:

var name;
var names = [];
for (name in window) {
    names.push(name);
}

。然后在最后删除任何不在该列表中的内容:

for (name in window) {
    if (names.indexOf(name) === -1) {
        window[name] = undefined; // See below for why not `delete`
    }
}

请注意,在大多数情况下,您将无法实际删除该属性(例如,delete window.foo;大多数情况下不起作用),因为 A)如果属性是通过 var 创建的,则无法删除它,并且 B) 大多数版本的 IE 不允许delete window 的任何属性。但是您可以为它们分配undefined

或者,如果您

使用对象,则以后检查属性名称可能更容易,而不是数组:

var name;
var names = {};
for (name in window) {
    names[name] = 1;
}

然后检查变为:

for (name in window) {
    if (!names.hasOwnProperty(name)) {
        window[name] = undefined; // See above for why not `delete`
    }
}

另请查看此线程以了解许多不同的方法:检测和报告用户定义的全局变量

值得

一提的一个值得注意的技巧是创建一个 iframe,并将 iframe 的窗口对象属性与当前窗口对象属性进行比较。这种方法的优点是您可以随时使用它,即使在应用程序启动后,您甚至可以定期运行它。