检测页面全局变量脚本

上次说到严格模式也不能完全保证不会意外跑出全局变量,所以最好还有一种更方便的检测方法。

jshint

本文不表

亡羊补牢,后知后觉

由于不同的流量器宿主全局方法并不一样,但同一个浏览器的不内window实例一定是一样的,所以我们可以构建一个临时的iframe,里面的window对象是干净无污染的,只要拿topwindow和这个iframeWindow中的变量进行对比,就行。如果是用户不小心抛出去的全局变量,一定是可写可读的,不可能是用Object.Object.defineProperty搞出来的只读的常量。于是便有了以下代码: 可将此链接直接拖到收藏夹栏使用 🐭检测全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
;(function (topWindow, document) {
var iframeWindow
var whiteList = []
var ret = []
function checkGlobalVar () {
var iframe = document.createElement('iframe'), i, originValue
document.body.appendChild(iframe)
iframeWindow = iframe.contentWindow
for (i in topWindow) {
if (!(i in iframeWindow) && !~whiteList.indexOf(i)) {
originValue = topWindow[i]
topWindow[i] = '耗子么么哒' // 写一个不可能是系统预设的值
if (topWindow[i] === '耗子么么哒') {
iframeWindow.console.info(i) // 防止重写了 topWindow 的 console
ret.push(i)
}
topWindow[i] = originValue
}
}
iframeWindow.console.warn('共找到' + ret.length + '个全局变量')
document.body.removeChild(iframe) // 干完坏事会死灭迹
iframeWindow = null
}
setTimeout(function () {
if (!document.body) {
alert('页面还没加载完!')
return
}
checkGlobalVar()
}, 1000)
})(top, document)