让我们说我想得到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);
可以这样做吗?
答案 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);