请选择 进入手机版 | 继续访问电脑版
开启辅助访问
帐号登录 |立即注册

JavaScript 闭包机制的详解

 
一.什么是闭包?
闭包是什么?我们先看看 MDN 上对它的解释:
闭包是函数和声明该函数的词法环境的组合。

闭包的三条特性:
1.闭包一定是函数内嵌套函数。
2.闭包可以让我们在函数外部访问函数内部的私有变量和私有函数。
3.带有闭包的词法环境中的变量和函数不会被GC机制回收。

function aa(){
var bb = 'This is a Test';
function cc(){
        console.log(bb)
    }
    return cc;
}
var dd = aa();
dd();  // logs 'This is a Test'

上面这个函数,就是一个基础的闭包,我们可以看到,在函数 aa( ) 中有一个 函数内变量 bb 和一个函数内函数 cc( ),cc( )函数中引用了aa( ) 作用域内的 bb 变量,然后被 aa 的作用域返回,暴露给了 window 环境。

这么一个简单的闭包,我们可以简单归纳出闭包三个特性中的前两个:

1.闭包一定是函数内嵌套函数。
2.闭包可以让我们在函数外部访问函数内部的私有变量和私有函数。

OK,我们再来看一个例子:
function aa(){
var count = 0;
function cc(){
        count++;
        console.log(count)
    }
    return cc;
}
var dd = aa();
dd(); // logs 1
dd(); // logs 2
dd(); // logs 3

那么它使用起来与普通函数有什么区别呢?我们进行一个对比就清楚了:

function aa_normal(){
var count = 0;
function cc(){
        count++;
        console.log(count)
    }
    return cc();
}
aa_normal();  // logs 1
aa_normal();  // logs 1
aa_normal();  // logs 1

我们还可以更大胆,更奔放一些:

function aa_normal(){
var count = 0;
count++;
console.log(count)
}
aa_normal();  // logs 1
aa_normal();  // logs 1
aa_normal();  // logs 1

这下是不是对比就很鲜明了?根据 JavaScript 的 GC 机制,普通的函数在每一次调用结束时,都会被内存回收,所以普通函数无论你执行多少次,那个 count 都只会是1,你问我为什么?因为你永远叫不醒一个装睡的人嘛。而对于闭包来说就不一样了,它会一直留在内存中,除非你手动清除它。
so~我们得出了闭包三个特性中的最后一个特性:
3.带有闭包的词法环境中的变量和函数不会被GC机制回收。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则