在 javascript 函数和内存管理中声明变量
Declare vars inside javascript function and memory management
一段时间以来,我一直怀疑这种类型代码中的 js 潜在内存泄漏:
function foo() {
var a = "This is my content";
$('#myElemId').on('click', function() {
$(this).html(a);
});
}
我的问题是:
当调用 foo 时,我想它创建了一个执行对象,为 var a 分配内存并将事件侦听器分配给 dom 元素。一旦 foo returns 它应该释放执行对象,但我认为它不会因为点击侦听器仍然引用 var a ,对吧?
这是一个典型的 closure
问题。实际上,匿名函数将保留 foo
的 VariableEnvironment 的副本,但不会保留 a
。所以当 foo
结束执行时,它的执行上下文和 a
一样被销毁。匿名函数仍然可以通过它的范围链引用 a
。
你是对的。
变量只有在不再需要时才会被释放。
在您的情况下,事件回调仍然需要变量 a,因此它不会被释放。它仍然存在,
正如elaijuh对这个post的另一个回答所说,它是真实变量的副本,实际上它不是存储在事件回调函数中的副本。
你可以看到这个fiddle http://jsfiddle.net/3y7qbjav/ ,所以你仍然可以在绑定点击事件后更改var a 的值。所以变量没有释放。
function foo() {
var a = "This is my content";
$('#myElemId').on('click', function() {
$(this).html(a);
});
a="new content after the event binding";
}
一段时间以来,我一直怀疑这种类型代码中的 js 潜在内存泄漏:
function foo() {
var a = "This is my content";
$('#myElemId').on('click', function() {
$(this).html(a);
});
}
我的问题是:
当调用 foo 时,我想它创建了一个执行对象,为 var a 分配内存并将事件侦听器分配给 dom 元素。一旦 foo returns 它应该释放执行对象,但我认为它不会因为点击侦听器仍然引用 var a ,对吧?
这是一个典型的 closure
问题。实际上,匿名函数将保留 foo
的 VariableEnvironment 的副本,但不会保留 a
。所以当 foo
结束执行时,它的执行上下文和 a
一样被销毁。匿名函数仍然可以通过它的范围链引用 a
。
你是对的。 变量只有在不再需要时才会被释放。
在您的情况下,事件回调仍然需要变量 a,因此它不会被释放。它仍然存在,
正如elaijuh对这个post的另一个回答所说,它是真实变量的副本,实际上它不是存储在事件回调函数中的副本。
你可以看到这个fiddle http://jsfiddle.net/3y7qbjav/ ,所以你仍然可以在绑定点击事件后更改var a 的值。所以变量没有释放。
function foo() {
var a = "This is my content";
$('#myElemId').on('click', function() {
$(this).html(a);
});
a="new content after the event binding";
}