5

假设我想获取window用户定义的所有变量的列表。换句话说,它们不是浏览器在 ECMAScript 中创建或定义的属性或对象。

例如,假设页面上有这个脚本:

<script>
    window.__$DEBUG = true;
    var Analytics = function() {};
</script>

我希望能够循环window并获取一个包含__$DEBUG它的值和Analytics它的值的列表:

var nonNatives = (function nonNative(scope) {
    var result = {};
    for (var child in scope) {
        if (!isNative(child)) {
            result[child] = scope[child];
        }
    }
    return result;
})(window);

这可以做到吗?

4

1 回答 1

6

我以前通过创建一个函数(在任何其他 JS 之前加载)来完成此操作,该函数会记住window(即内置属性)的当前键,并且在再次调用时会显示差异。

如果目的只是为了检测意外的全局变量,上述函数可以是一个匿名的 IIFE(这样它本身不会污染全局范围),它包含范围内的当前列表,然后定期调用另一个封闭的函数(带有setTimeout)比较列表,并为下次更新,例如:

(function(scope) {

    var keys = Object.keys(scope);
    var map = {};
    for (var i = 0, n = keys.length; i < n; ++i) {
        map[keys[i]] = 1;
    }

    (function update() {
        var current = Object.keys(scope);

        // compare lists and print the differences
        for (i = 0, n = current.length; i < n; ++i) {
            var name = current[i];
            if (!(name in map)) {
                console.log(name + ' = ' + scope[name]);
                map[name] = 1;
            }
        }

        // loop
        setTimeout(update, 1000);
    })();

})(window);
于 2013-05-24T15:47:30.823 回答