2016-01-24 65 views
1

我刚刚读到局部变量只存在于它声明的函数结束之前。闭包:函数返回后,局部变量如何保持活动状态?

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

我猜垃圾收集器将消灭了“关闭”变量...

现在好了,对不起,这么详细,我想我需要多多练习的橡皮鸭子techniqe。

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

那么,内存泄漏?任何选项来检查这些变量的清单并清理它们?

+2

[什么是垃圾收集](http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection) – adeneo

+1

@ adeneo它是一个人在卡车周围一次来除去旧的地方电视和啤酒罐? – charlietfl

回答

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() 
0

闭包是真的只是一个整洁的编译器的把戏。当编译器检测到一个变量被“关闭”的情况(一个变量在嵌套的作用域中在词法上使用)时,它会为您生成一个新对象,并将您的局部变量分配给生成对象上的一个字段。作为开发人员,您绝对不用担心访问该变量,因此编译器基本上会为您替换这个变量。

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(); 
2

你想知道如何实现内部功能?不同的JS引擎可以使用不同的策略。重要的是语言的行为。

Brendan Eich - JavaScript的创造者 - 是Scheme的忠实粉丝,因此增加了对JS的闭包,其行为与Scheme闭包完全相同。其中一位计划创始人在1986年的一系列讲座中给出了关于如何关闭工作的最好解释,称为“计算机程序的结构和解释”,具体来说是lecture 7A7B,他在那里谈论如何撰写口译员并解释如何参数和局部变量存储在闭包关闭的“环境”中。顺便说一句。现在“环境”这个术语的使用方式不同,至少在JavaScript世界中,闭包仍然以他们当时的方式工作。