深入了解闭包,探索函数内的秘密世界

153 阅读2分钟

前言

闭包

定义

在javascript中,根据词法作用域的规则,内部函数一定能访问外部函数中的变量,当内部函数被拿到外部函数之外调用时,即使外部函数执行完毕,但是内部函数对外部函数中的变量依然存在引用,那么这些被引用的变量会以一个集合的方式保存下来,这个集合就是闭包。

作用

实现变量私有化

缺陷

闭包可能会造成内存泄漏。 内存泄漏指的是程序在运行过程中未能正确地释放已经不再需要的内存,导致系统中的可用内存持续减少,最终可能导致系统性能下降甚至崩溃。当程序动态分配内存空间但却没有释放这些内存空间时,就会发生内存泄漏。

实例一

代码

function foo() {

 function bar() {
    var age = 18;
    console.log(myName);
 }
 var myName = 'ltt';

 return bar;
}

var myName = 'lpp';
var fn = foo();
fn();

image.png

分析

image.png

该代码生成上图所示的栈结构,foo执行完后会进行销毁,但是销毁后执行bar时就会报错,那么这个时候内部函数可以访问外部函数的规则好像就失效了,所以为了解决这个问题,提出闭包的概念。

image.png

foo执行完被销毁后会留下一个闭包(foo closure)用于存放那些外部函数中被内部函数引用的变量的集合。

实例二

代码

function add() {
    let count = 0;
    function fn(){
       return ++count; 
    }
    return fn;
}

var res = add();

console.log(res());
console.log(res());
console.log(res());

image.png

分析

image.png

add执行完毕后形成一个闭包,里面存放count=0;fn每次执行时会去闭包找count。

结语

大家有收获吗?如果有错误或者不同见解的地方,记得疯狂call小编。小编一定虚心请教,和各位一起成长~

image.png