JS闭包(简单版)

什么是闭包?

闭包: 能够访问到另一个函数作用域的函数。

非闭包函数简单例子:

function outer () {
    var number = 0;
    number++;
        return number;
}
outer(); // 1
outer(); // 1

上面是一个很简单的例子,调用test函数,使内部变量加1后返回。

但是,当我们有这么一个需求,每次调用test函数后,都让number+1,显然上面的代码是无法做到的,因为每调用一次都会重头执行函数,变量都是全新的,无法缓存 number 变量。
解决方法:

  • 把number变量定义到全局中(不推荐,应避免定义过多全局变量)
  • 使用闭包。(本章主角)

使用闭包缓存变量

闭包例子:

function outer () {
    var number = 0;
    function inner () {//由于inner引用了外部作用域的number 因此形成了闭包
        number++;
                console.log(number);
    }
    return inner;
}
var f1 = outer(); //返回 inner函数
f1(); // 1
f1(); // 2
var f2 = outer(); //返回 inner函数
f2(); // 1
f2(); // 2

上面代码中的 inner 函数中的 number 就是形成闭包的“元凶”,由于inner函数没有自己的number变量,所以会引用外部作用域(outer作用域)的number变量,因此当 inner函数被返回后,outer 函数number变量得不到释放,因为f对其有引用,因此number变量一直会在内存中,直到 f = null;
因此每次调用f()都会让相同的引用number值+1。
这就是闭包。

总结:

可以利用闭包保存函数的变量,并且外部无法直接访问到内部变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。