Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在创建全局变量时,如何记录这些变量的相关信息? 背景_Javascript_Debugging_Global Variables_Google Chrome Devtools - Fatal编程技术网

Javascript 在创建全局变量时,如何记录这些变量的相关信息? 背景

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) 可能有用。如何实现该功能 研究 我想,每当创建新变量时,我都需要某种类型的事件 我们确

我刚刚了解到在DevTools控制台中调用
keys(window)
(或
Object.keys(window)
)会显示全局范围内的变量()。我在StackOverflow页面上调用了该代码,得到了以下结果:

变量
i
引起了我的注意,因为它似乎由于一个错误而在全局范围内。我试图找到负责声明
I
的代码,但结果很麻烦(有很多代码和
I
s)

问题: 获取控制台警告,其中显示

已创建全局变量“i”(main.js:342)

可能有用。如何实现该功能

研究 我想,每当创建新变量时,我都需要某种类型的事件

  • 我们确实有JavaScript语言。但是,创建setter需要提供属性名称。因为我想监控所有属性,所以我不能真正使用它
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • Object.observe
    ()没有透露创建属性的代码的任何信息(
    console.trace()
    只提供了观察者函数的名称)
  • Object.prototype.watch
    ()-与setter相同,您必须指定属性名称
  • 无论何时创建新的全局变量,调用
    Object.preventExtensions(窗口)
    ()都会导致堆栈跟踪良好的错误。此解决方案的问题在于,它会干扰脚本执行,并可能会改变其行为。它也不允许我捕捉错误并正确设置格式
笔记
  • 我知道jshint/jslint,我仍然认为在运行时捕获这些声明可能很有用
  • 我不太关心页面上的
    I
    变量,您可能可以使用setter找到声明。我的问题涉及这个问题的一般解决办法

你肯定已经完成了你的家庭作业,你想到了我会想到的所有事情,正如你发现的,没有一件适合你

我能想到的唯一方法是只监视全局对象(本例使用
window
作为全局对象:相应地修改节点或另一个JavaScript容器)。下面是一个监视新全局和已删除全局的示例(如果不需要监视删除,可以删除该功能):


请参见此处的操作:

在我看来,您有两个不错的选择:

  • JSHint
  • 严格模式
    当你泄露全球机密时,他们都会对你大喊大叫。严格模式可能更适合您的用例

    您可以尝试此方法来获取已创建的全局变量列表:

    (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;
    })();