Javascript函数调用结束时的闭包和变量范围

时间:2016-02-19 15:10:12

标签: javascript closures

我读过这篇优秀作品: How do JavaScript closures work?

但我还有疑问......

StackOverflow标签定义"闭包" as" Closure是一个第一类函数,它引用(关闭)来自定义它的作用域的变量。 如果闭包在其定义范围结束后仍然存在,则它关闭的变量将继续存在"。

当我的函数以返回结束时,是否会删除其中定义的所有变量并释放内存分配?在我看来,当一个人可以回答是或否时,就存在条件。

是的,我知道记忆充足且自由,但这不是我的问题。

考虑一个基于Intranet的应用程序,ajax的数据在一个工作日内后退和前进。由于客户收到数据,按摩,不再需要,因此可以免除。糟糕的编程技术可能导致不再是用户或需要的数据累积(或者更糟糕的是,使用的数据不同步)。

阅读上面关闭的文章告诉我,函数中的一些变量仍然可以从函数范围之外引用。我猜我需要多次重读封文,因为我可能还没有完全理解它。

有人可以分享变量继续存在的例子吗?

并且......如果在每个函数开始时我声明我的变量,并且在使用&#34之前返回true,那么我是否会获益?"如果我将变量重新赋值为null?

所有帮助表示赞赏......

4 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我,但我不认为

  

函数中的一些变量仍然可以从函数范围外引用

是真的。

闭包记住函数调用的上下文,并将相关变量(即this等)绑定到闭包的范围。如果这是正确的,那么再次调用闭包将导致旧变量'垃圾收集的价值,你不必担心内存浪费或不同步数据。

答案 1 :(得分:0)

IBar将存在于IIFE num之外的a函数中,并返回c



a




答案 2 :(得分:0)

当你从一个函数return true时,你没有一个闭包。从函数返回函数时有一个闭包,如下所示:

function makeAdder( firstNumToAdd ){
     return function( secondNumToAdd ){
          return mainNumToAdd + secondNumToAdd;
     }
}

var add3 = makeAdder(3);

var seven = add3(4);

在上面的示例中,变量firstNumToAdd虽然范围是函数makeAdder,但内部函数始终可以访问它,即使函数在执行行var add3 = makeAdder(3); <之后退出/ p>

答案 3 :(得分:0)

obj = {
    func: function(){
        var test = 'preserved value';
        this.func2 = function(){
            console.log(test);
        };
    }
};

obj.func();
obj.func2();  //'preserved value'
obj.func = undefined;
obj.func2();  //'preserved value'

如您所见,即使在完全吹走原始范围(func)后,封闭范围仍保留test var。