Javascript 在创建全局变量时,如何记录这些变量的相关信息? 背景
我刚刚了解到在DevTools控制台中调用Javascript 在创建全局变量时,如何记录这些变量的相关信息? 背景,javascript,debugging,global-variables,google-chrome-devtools,Javascript,Debugging,Global Variables,Google Chrome Devtools,我刚刚了解到在DevTools控制台中调用keys(window)(或Object.keys(window))会显示全局范围内的变量()。我在StackOverflow页面上调用了该代码,得到了以下结果: 变量i引起了我的注意,因为它似乎由于一个错误而在全局范围内。我试图找到负责声明I的代码,但结果很麻烦(有很多代码和Is) 问题: 获取控制台警告,其中显示 已创建全局变量“i”(main.js:342) 可能有用。如何实现该功能 研究 我想,每当创建新变量时,我都需要某种类型的事件 我们确
keys(window)
(或Object.keys(window)
)会显示全局范围内的变量()。我在StackOverflow页面上调用了该代码,得到了以下结果:
变量i
引起了我的注意,因为它似乎由于一个错误而在全局范围内。我试图找到负责声明I
的代码,但结果很麻烦(有很多代码和I
s)
问题:
获取控制台警告,其中显示
已创建全局变量“i”(main.js:342)
可能有用。如何实现该功能
研究
我想,每当创建新变量时,我都需要某种类型的事件
- 我们确实有JavaScript语言。但是,创建setter需要提供属性名称。因为我想监控所有属性,所以我不能真正使用它
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
()没有透露创建属性的代码的任何信息(Object.observe
只提供了观察者函数的名称)console.trace()
()-与setter相同,您必须指定属性名称Object.prototype.watch
- 无论何时创建新的全局变量,调用
()都会导致堆栈跟踪良好的错误。此解决方案的问题在于,它会干扰脚本执行,并可能会改变其行为。它也不允许我捕捉错误并正确设置格式Object.preventExtensions(窗口)
- 我知道jshint/jslint,我仍然认为在运行时捕获这些声明可能很有用
- 我不太关心页面上的
变量,您可能可以使用setter找到声明。我的问题涉及这个问题的一般解决办法I
window
作为全局对象:相应地修改节点或另一个JavaScript容器)。下面是一个监视新全局和已删除全局的示例(如果不需要监视删除,可以删除该功能):
请参见此处的操作:在我看来,您有两个不错的选择:
当你泄露全球机密时,他们都会对你大喊大叫。严格模式可能更适合您的用例 您可以尝试此方法来获取已创建的全局变量列表:
(function(){
var differences = {},
ignoreList = (prompt('Ignore filter (comma sep)?', 'jQuery, Backbone, _, $').split(/,\s?/) || []),
iframe = document.createElement('iframe'),
count = 0; ignoreList.push('prop');
for (prop in window) {
differences[prop] = {
type: typeof window[prop],
val: window[prop]
}; count++;
}
iframe.src = 'about:blank';
iframe.style.display = 'none';
document.body.appendChild(iframe);
iframe = iframe.contentWindow || iframe.contentDocument;
for (prop in differences) {
if (prop in iframe || ignoreList.indexOf(prop) >= 0) {
delete differences[prop];
count--;
}
}
console.info('Total globals: %d', count);
return differences;
})();
谢谢伊桑,谢谢你的意见!可以使用
对象简化代码。请遵守()。此解决方案的问题是,我们无法获得有关变量声明位置的任何信息:(啊,你说得对,康拉德。我没有对对象做太多的工作。观察,所以我的大脑没有去那里。是的,这对声明位置没有帮助,所以可能对操作没有多大价值。哦,好吧。谢谢保罗,我忽略了显而易见的问题。在严格模式下抛出的引用错误确实有我需要查找的所有信息e漏洞。我希望可以很容易地将一些东西注入页面(例如,找到所提到的I
变量的漏洞),但也许我可以以某种方式强制所有脚本使用严格模式-我将对此进行实验。非常明显。很好,Paul。闭包编译器+linter。
(function(){
var differences = {},
ignoreList = (prompt('Ignore filter (comma sep)?', 'jQuery, Backbone, _, $').split(/,\s?/) || []),
iframe = document.createElement('iframe'),
count = 0; ignoreList.push('prop');
for (prop in window) {
differences[prop] = {
type: typeof window[prop],
val: window[prop]
}; count++;
}
iframe.src = 'about:blank';
iframe.style.display = 'none';
document.body.appendChild(iframe);
iframe = iframe.contentWindow || iframe.contentDocument;
for (prop in differences) {
if (prop in iframe || ignoreList.indexOf(prop) >= 0) {
delete differences[prop];
count--;
}
}
console.info('Total globals: %d', count);
return differences;
})();