前端学习之JavaScript——闭包

108 阅读2分钟

(本文仅仅为个人理解,若有错误,还望纠正)

什么是闭包

【书上的定义】闭包是指有权访问另一个函数作用域中的变量的函数
【个人的理解】在一个内部函数里面使用外部函数中定义的变量

常见的闭包

在一个函数内创建一个内部函数,内部函数使用外部函数定义的变量,外部函数以内部函数为返回值。

function getFunc(){
    var num = 0;
    return function add(){
        return num++;
    }
}
var add = getFunc();
console.log(add()); //0
console.log(add()); //1

在函数getFunc内部返回了一个函数add,函数add使用了getFunc中定义的num变量

闭包的作用

1 给函数设置状态

正如上面的例子,可以把num理解为是函数add的一个状态,这个状态是对add函数的每一次执行都有影响,即可以理解为num是服务于函数add的每一次执行;而且这个状态是可变的(如 num++; ,每次都会对状态进行自增)。

假如把这个状态定义在内部函数里面:

function add(){
    var num = 0;
    return num++;
}
console.log(add()); //0
console.log(add()); //0

那么每次执行函数add的时候,就会重新定义一次num,此时num只能服务于add函数的一次执行。

换个角度,闭包可以看成以下代码:

var num = 0;
function add(){
    return num++;
}
console.log(add()); //0
console.log(add()); //1

在全局环境下定义一个变量num和一个函数add,起到的效果和闭包相似,都是为函数add设置了一个状态num。

2 不让外部修改状态

上面说了全局环境和在外部函数都可以为函数设置状态,但仍然会有区别:在全局环境下设置的状态可以被其他代码语句修改,而在外部函数设置的状态,只能又闭包函数去修改。

var num = 0;
function add(){
    return num++;
}
console.log(add()); //0
num++;  //外部可以直接修改函数add的状态
console.log(add()); //2