美文网首页
JavaScript学习之闭包

JavaScript学习之闭包

作者: 愤怒的小猪 | 来源:发表于2021-06-14 07:19 被阅读0次

闭包的概念

    函数对象可以通过作用域i链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为"闭包"。

    我的理解是,只要是内部的函数被保存到了外部,就一定会生成闭包。或者说只要是能访问其他函数内部的变量的函数就是闭包。

举个例子:

function a(){
    function b(){
        console.log(aaa)
    }
    var aa = 123;
    return b;
}
var demo = a();
demo();

闭包的好处

  1. 可以读取函数内部的变量

  2. 可以让变量是始终保存在内存中,比如:单例

     var Singleton = function(name) {
            this.name = name;
        };
    
        Singleton.prototype.getName = function() {
            alert(this.name);
        };
    
        Singleton.getInstance = (function() {
            var instance = null;
    
            return function(name) {
                if (!instance) {
                    instance = new Singleton(name);
                }
                return instance;
            }
        }());
    
        Singleton.getInstance("12312").getName()
    

闭包的危害

  1. 使用不当则会产生内存泄漏

理解

我们知道为什么了闭包的好处与危害,那么为什么闭包可以让变量始终保存在内存中,为什么会产生内存泄漏呢?

1. 为什么闭包可以让变量始终保存在内存?
function a(){
    function b(){
        var c = 0
        console.log(aaa)
    }
    var aa = 123;
    return b;
}
var demo = a();
demo();
a函数被执行时会产生自己AO,当b函数被执行时也会产生自己的AO同时拥有a函数的AO。正常情况下a函数执行完以后,会释放自己的AO,b函数执行完以后也会释放自己的AO。但是现在b函数被a函数返回出来了,同时赋值给了demo,那么现在在demo就拥有了b的AO,如果demo一直不被销毁,那么b的作用域链就会一直存在内存中。
a.[[scope]] = [
    // AO
    {
        this:window,
        aa:123,
        b:(function)
    },
    // GO
    {
        this:window
        window:(Object),
        document:(Object)
        a:(function),
        demo: (function),
    }
]

b.[[scope]] = [
    // AO
    {
        this:window,
        c:0
    },
    // AO
    {
        this:window,
        aa:123,
        b:(function)
    },
    // GO
    {
        this:window
        window:(Object),
        document:(Object)
        a:(function),
        demo: (function),
    }
]
  1. 为什么会产生内存泄漏?

    如果闭包一直占用内存不被释放,会导致系统占用的内存越多,可以使用的内存越少,这也是一种内存泄漏。

相关文章

  • JavaScript----闭包

    javascript之闭包 闭包的概念     闭包(closure)是 JavaScript 的一种语法特性。 ...

  • 闭包

    学习Javascript闭包(Closure)

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

  • JavaScript学习之闭包

    参考 阮一峰 廖雪峰 闭包 变量作用域 限定变量的使用范围,就像是对于一个SAP的产品不同的角色有不同的使用权限;...

  • JavaScript学习之闭包

    闭包的概念 举个例子: 闭包的好处 可以读取函数内部的变量 可以让变量是始终保存在内存中,比如:单例 var Si...

  • 笔记:JavaScript闭包

    本文摘录及参考自:1. 学习Javascript闭包(Closure)2. 闭包的秘密3. JavaScript ...

  • avaScript 闭包的理解

    JavaScript 学习笔记之闭包 这篇文章是我学习闭包的笔记与总结,后面会有一些例子,结合画图的形式来理解,什...

  • 闭包

    原文出处 JavaScript深入之闭包 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • swift闭包学习

    闭包作为参数 参考 Swift学习之闭包

网友评论

      本文标题:JavaScript学习之闭包

      本文链接:https://www.haomeiwen.com/subject/adgbeltx.html