JavaScript闭包和内存管理
我很好奇闭包中的变量是如何处理内存的。以这段代码为例-JavaScript闭包和内存管理,javascript,performance,memory-management,closures,Javascript,Performance,Memory Management,Closures,我很好奇闭包中的变量是如何处理内存的。以这段代码为例- function iAmAClosure() { var txtName = document.getElementById('name'); function validation() { if (txtName.value.length === 0) { return false; } return true; } documen
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();
}
}
每当用户单击按钮时,都会调用Myvalidation
函数
我的问题是,只要页面处于活动状态,txtName
变量是否会留在内存中,还是每次调用方法验证时都会对其进行GC'ed和初始化?还有别的吗
在性能方面,什么更好?函数闭包中的任何变量都保存在内存中,只要有方法引用该函数。在这里,
txtName
是您的onclick
函数的闭包,因此只要onclick
绑定完好无损且“submit”按钮存在,它就会留在内存中。闭包并不重要,如果无法访问var,它就会被收集。“性能”取决于处理能力和内存大小。总的来说,你说不出哪个更好。但是请注意,要每次初始化它,您需要显式地将代码移动到验证
函数中-行为定义得很好。@dandavis:这就是闭包之所以重要的原因-它使变量可访问:)我只是说闭包本身对收集没有影响。IE6确实在封闭的事件处理程序方面存在一些问题,但那是很久以前的事了……我还想知道在Node这样的服务器环境中是否存在这种问题。考虑只要可以访问结束
和数据
事件处理程序,主体
变量就会保持不变。作为节点新手,我猜http模块会在请求完成后释放对这些事件处理程序的引用,从而释放body
closure变量。每个请求创建一个新的闭包(通过传递给createServer
的函数)和新的事件处理程序。但是医生没有说他们会这么做。谢谢。最后一个问题-在页面变慢之前,我可以使用多少内存,你有什么根据的猜测?chrome开发工具也是测试内存使用情况的最佳工具吗?