【问题标题】:JavaScript closures and memory managementJavaScript 闭包和内存管理
【发布时间】:2014-02-06 21:54:52
【问题描述】:

我很好奇闭包内的变量是如何处理内存的。以这段代码为例-

function iAmAClosure() {
    var txtName = document.getElementById('name');

    function validation() {
        if (txtName.value.length === 0) {
            return false;
        }
        return true;
    }

    document.getElementById('submit').onclick = function () {
        return validation();
    }
}

每当用户单击按钮时,都会调用我的 validation 函数。

我的问题是,只要页面处于活动状态,txtName 变量是否会保留在内存中,还是每次调用方法验证时都会被 GC 和初始化?还有其他的吗?

什么是更好的性能?

【问题讨论】:

  • 关闭没关系,如果var不可达,就会被收集。
  • “性能”确实取决于处理能力与内存大小。你不能说总体上哪个更好。但请注意,要每次都对其进行初始化,您需要将代码显式移动到您的 validation 函数中 - 行为已明确定义。
  • @dandavis:这就是闭包很重要的原因——它使变量可以访问:)
  • 我只是说关闭本身对这些天的收集没有影响。 IE6 DID 在封闭的事件处理程序方面存在一些问题,但那是很久以前的事了......
  • 我也想知道在 Node.js 等服务器环境中是否存在这种情况。考虑this stream example。只要enddata 事件处理程序可以访问,body 变量就会一直存在。作为一个 Node 新手,我猜 http 模块会在请求完成后释放对这些事件处理程序的引用,从而释放 body 闭包变量。每个请求都会创建一个新的闭包(通过传递给createServer 的函数)和新的事件处理程序。但医生并没有说他们这样做。

标签: javascript performance memory-management closures


【解决方案1】:

只要有方法可以引用该函数,函数闭包中的任何变量都会保存在内存中。这里,txtName 在你的onclick 函数的闭包中,所以只要onclick 绑定完好并且“提交”按钮存在,它就会留在内存中。

【讨论】:

  • 谢谢。最后一个问题 - 关于在页面变慢之前我可以使用多少内存,您最有根据的猜测是什么? chrome 开发工具也是测试我的内存使用情况的最佳工具吗?
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多