Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包:函数返回后,局部变量如何保持活动状态?_Javascript_Closures - Fatal编程技术网

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

Javascript 闭包:函数返回后,局部变量如何保持活动状态?,javascript,closures,Javascript,Closures,我刚刚读到局部变量只在声明它的函数结束之前存在 谢谢大家的回答。我的主要问题是这两种说法相互矛盾。那么哪一个是正确的呢?我想矛盾只是表面的 我猜垃圾收集器会清除“closed”变量 好吧,抱歉这么冗长,我想我需要多练习橡皮鸭技术 我刚刚意识到,我们在闭包中声明了一个局部变量,然后垃圾收集器不会擦除该变量,因为我们持有来自返回对象的引用,对吗 那么?内存泄漏?是否可以选择检查并清除这些变量的列表?打开它的作用域 样本1 function() { var localVarThatWouldGo

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

谢谢大家的回答。我的主要问题是这两种说法相互矛盾。那么哪一个是正确的呢?我想矛盾只是表面的

我猜垃圾收集器会清除“closed”变量

好吧,抱歉这么冗长,我想我需要多练习橡皮鸭技术

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

那么?内存泄漏?是否可以选择检查并清除这些变量的列表?

打开它的作用域

样本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()

闭包实际上只是一个简洁的编译器技巧。当编译器检测到一个变量被“关闭”的情况时(一个变量在嵌套的作用域中以词汇形式使用),它会在后台为您生成一个新对象,并将您的局部变量分配给所生成对象上的一个字段。作为一名开发人员,您不必担心在
生成对象时访问该变量。您的变量
,编译器本质上为您使用别名

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

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


JavaScript的创建者Brendan Eich非常喜欢Scheme,因此在JS中添加了与Scheme闭包行为完全相同的闭包。Scheme的一位创造者在1986年的一系列讲座中给出了闭包如何工作的最好解释之一,称为“计算机程序的结构和解释”,特别是在讲座中,他谈到了编写解释器,并解释了参数和局部变量如何存储在“环境”中一个关闭关闭。顺便说一句,“环境”一词在当今的使用方式有所不同,至少在JavaScript世界是这样,但闭包的工作方式仍然与当年相同。

@adeneo这是一个家伙每周开一次卡车过来取旧电视和啤酒罐的地方?