0

有什么方法可以找出 Web 应用程序在全局范围(窗口)中声明/注入的所有变量?我想从身体上卸载窗口上删除所有这些声明的东西,以便在关闭选项卡时会释放它的内存。

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

4

2 回答 2

2

这样做的理由: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`
    }
}
于 2012-05-29T07:47:01.480 回答
0

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

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

于 2012-05-29T07:57:37.620 回答