我只是读到局部变量只存在于声明它的函数结束之前。
谢谢大家的回答。我的主要问题是这两个陈述相互矛盾。那么哪一个是真的?我猜这个矛盾只是肤浅的。
我猜想垃圾收集器会擦掉“关闭”的变量......
现在好了,抱歉这么冗长,我想我需要练习更多的橡皮鸭技术。
我刚刚意识到我们在闭包中声明了一个局部变量,然后垃圾收集器不会擦除变量,因为我们保留了返回对象的引用,对吗?
所以?内存泄漏?有没有检查这些变量列表并清理它们的选项?
答案 0 :(得分:2)
您想了解内部如何实施该功能?不同的js引擎可以在那里使用不同的策略。重要的是语言的行为。
Brendan Eich-- JavaScript的创建者 - 是Scheme的忠实粉丝,因此为JS添加了闭包,其行为与Scheme闭包完全相同。方案创作者之一在1986年给出的一系列讲座中给出了关闭如何工作的最佳解释之一,称为“#34;计算机程序的结构和解释”,特别是{{3} }和lecture 7A他谈到编写一个解释器,并解释了参数和局部变量如何存储在"环境中#34;封闭关闭。顺便说一句。术语"环境"现在使用的方式不同,至少在JavaScript世界中,但是闭包的工作方式与当时的工作方式相同。
答案 1 :(得分:0)
打开它的范围。
样本1
function() {
var localVarThatWouldGo = "hi";
// set to window scope
window.myVar = localVarThatWouldGo;
}
但是设置全局范围变量并不是一种好习惯。而是将其设置为您需要的范围。例如,如果您的应用程序位于视图模型中,那么:
样本2
function runApp() {
// point to this object
var self = this;
this.myFunction = function() {
self.scopedVariable = "hi"; // this won't go for the life time of the app variable below
}
}
var app = new runApp()
答案 2 :(得分:0)
闭包只是一个简洁的编译器技巧。当编译器检测到变量被关闭的情况时," (变量在嵌套范围内以词汇方式使用),它为您生成一个新对象,并将您的局部变量分配给生成对象上的字段。作为开发人员,您永远不必担心以generatedObject.yourVariable
访问该变量,编译器基本上会为您设置别名。
var getTimeSinceStartUp = (function() {
var time = new Date(); //time is 'closed over', it 'leaks' into the sub scope
return function() {
return new Date() - time; //time is available here because of the hidden type the compiler made for you.
});
})();
var ms = getTimeSinceStartup();