JavaScript:枚举给定范围内的非本机对象

时间:2013-05-24 15:42:55

标签: javascript

让我们说我想得到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);

可以这样做吗?

1 个答案:

答案 0 :(得分: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);