闭包:在函数返回后,如何使局部变量保持活动状态?

时间:2016-01-24 00:14:35

标签: javascript closures

我只是读到局部变量只存在于声明它的函数结束之前。

谢谢大家的回答。我的主要问题是这两个陈述相互矛盾。那么哪一个是真的?我猜这个矛盾只是肤浅的。

我猜想垃圾收集器会擦掉“关闭”的变量......

现在好了,抱歉这么冗长,我想我需要练习更多的橡皮鸭技术。

我刚刚意识到我们在闭包中声明了一个局部变量,然后垃圾收集器不会擦除变量,因为我们保留了返回对象的引用,对吗?

所以?内存泄漏?有没有检查这些变量列表并清理它们的选项?

3 个答案:

答案 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();