闭包

闭包

闭包是什么?

优点和使用场景:技术难点用闭包解决

  1. 函数内部的变量

  2. 临时数据

    比如for循环的i值,希望延时使用,可以使用闭包把临时数据保存到局部变脸域中

  3. 防止变脸污染

    用闭包把业务变量放在局部作用域中

缺点以及解决方法

闭包使用不当会导致内存泄漏问题

  • 内存泄漏:浏览器运行网页,就会执行js代码,引用数据会在内存中占用内存空间

  • 内存管理机制:垃圾回收机制(运行过程中外部可能返回,则不会销毁),引用计数 底层浏览器的代码实现的功能

function fn() {
    var obj= {age:20};
    function tool() {
        return obj.age;
    }
    return tool
}
var re = fn()	// 内存泄漏,外部可以引用内部的数据,内部的obj对象不会释放

内存泄漏的解决方案

  1. 尽量避开 不要使用闭包

  2. 在可能存在泄漏的地方把标识符引用为空

    function fn() {
        var obj= {age:20};
        function tool() {
            return obj.age;
        }
        return tool
    }
    var re = fn()	// 内存泄漏,外部可以引用内部的数据,内部的obj对象不会释放
    re = null;	//可能泄漏地方,标识符指定为空
    
  3. es6的,用let来定义变量

    function fn() {
        let obj = {age:30};	
        function tool() {
            return obj.age;
        }
        return tool;
    }
    

具有作用域代码块

一个函数返回函数内部的工具函数,外部通过工具函数间接访问局部变量的过程

利用函数自调用,每次调用的局部变量或则形参都是独立的,来保存一些独立的,保存一些临时数据

利用函数独立作用域来生成业务代码块 内部的变量相互不冲突

function fn() {
    var a = 20;
    console.log(a)
}
fn()

闭包的技术的好处

  • 通过业务点对闭包做区分

    利用函数的作用域和运行时的作用域,函数变量外部无法访问,但可以返回一个闭包,外部操作闭包来间接访问函数内部的变量,闭包可以决定这个变量的操作方式

  • 函数每次调用时生成的独立调用栈

    var arr = [];
    function fn(index) {
        arr[index] = function() {
            console.log(index)
        }
    }
    for(var i = 0; i < 5; i++) {
        arr[i] = fn(i);
    }
    arr[0]();
    // 0
    var arr = [];
    for(var i =0; i < 5; i++) {
        (function(index) {
            arr[index] = function() {
                console.log(index)
            }
        })(i)
    }
    
  • 利用函数复用功能,制作复用工具,参数返回值

posted @ 2022-06-12 13:53  a立方  阅读(24)  评论(0编辑  收藏  举报