在 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返回,它应该释放执行对象,但我认为它不会,因为点击侦听器仍然有对var a的引用,对吧?
你是对的。只有在不再需要变量时,才会释放变量。
在您的情况下,事件回调仍然需要变量 a,因此不会解除分配。它仍然存在,
正如 elaijuh 对这篇文章的另一个答案所说,它是实变量的副本,实际上它不是存储在事件回调函数中的副本。
你可以看到这个小提琴 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";
}
这是一个
典型的closure
问题。 实际上匿名函数会保留foo
的变量环境的副本,但不会保留a
。 因此,当foo
ENNDS 执行时,它的执行上下文被销毁并a
。 匿名函数仍然可以通过其作用域链引用a
。
相关文章:
- 使用同一对象中的其他变量声明变量
- 用||声明变量
- 使用javascript使用for循环声明变量
- JavaScript-用for循环项声明变量
- try声明变量的作用域
- 有没有一种方法可以使用函数参数的值来声明变量
- 在使用javascript再次声明变量之前,请先清除或删除该变量
- Javascript未声明变量
- 在Javascript中,我可以在声明变量之前使用它吗
- 在html文档的开头声明变量
- 按什么顺序声明变量和函数
- 如何以正确的方式在jQuery中声明变量
- 在 Angular 服务中接收函数的未声明变量
- 字典和声明变量
- 需要一些有关以以下样式声明变量的信息
- 在 jQuery 中使用常量声明变量
- 从外部文件在打字稿中声明变量得到引用错误:..未定义
- JavaScript,声明变量时混淆语法
- 在 javascript 函数和内存管理中声明变量
- Javascript 使用 if 语句声明变量