【问题标题】:JavaScript: detect invisible variablesJavaScript:检测不可见的变量
【发布时间】:2013-05-11 20:26:38
【问题描述】:

我有一个关于 JavaScript 隐藏或不可见变量的问题。因为它们不是在全局上下文中创建的。当我们编写大型 Web 应用程序时,一些变量或函数是不可分割的,但我们不知道它们的存在。他们像 CPU、GPU 一样吃掉我们的资源。例如,我总是希望匿名函数中的所有变量在执行后都会被删除(当然,如果没有从上层上下文中引用它)。在此示例中,我无法在任何地方看到 interval 变量,但它始终写入控制台 interval id。

(function () {      
    var interval = setInterval(function(){
        console.log(interval.toLocaleString());
        // some heavy operation
    }, 1000);
})();

另一个例子是我在 Backbone.js 中创建了视图,然后我意识到删除视图后它也存在。 我的问题是,如何找到或查看所有存在但在全局上下文中不可见的变量?

【问题讨论】:

  • interval 消耗您的计算机资源与console.log() 工作无关
  • 示例中的变量“interval”在调用匿名函数后不需要保持活动状态,因为闭包(计时器处理程序)中没有对它的引用。
  • Tools for debugging memory leaks in JavaScript 的可能重复项 - 不确定您实际要求的是什么;您可以在浏览器的 JavaScript 调试器中检查这些变量
  • @Pointy 我已将区间 variable 添加到 setInterval 中。你怎么看,interval 变量在匿名函数调用后是生是死?而且我想知道在全局上下文中不可见的变量。
  • 看看这个关于闭包的页面。 stackoverflow.com/questions/111102/…。在您的示例中,间隔不会“死亡”,因为通过在您创建闭包的函数中调用函数。毫无疑问,有人将能够更好地解释它。阅读上面的链接。

标签: javascript variables scope


【解决方案1】:

请看这两页:

https://developers.google.com/chrome-developer-tools/docs/heap-profiling

https://developers.google.com/chrome-developer-tools/docs/heap-profiling-containment

基本上,您需要对堆进行快照并浏览其内容以在Chrome's developer tools 中找到上下文变量

— 函数上下文中的变量,可从函数闭包内部通过其名称访问;

您将能够通过颜色确定堆中的哪些元素是上下文/闭包变量(请参阅 Chrome 开发工具底部的参考键 ?)。

【讨论】:

    【解决方案2】:

    setInterval()实际上返回了“interval”对象的intervalID。这是一个整数。

    来自Mozilla's site

    var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
    var intervalID = window.setInterval(code, delay);
    

    清除数据(并停止间隔)的唯一方法是使用.clearInterval

    window.clearInterval(intervalID)
    

    因此,正在发生的事情可能与您想的不完全一样。该变量存在,但您的interval 变量只是intervalID

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2021-01-21
      相关资源
      最近更新 更多