由于js的作用域链规则,函数内部能够访问到函数外部的数据,但在函数外部,无法访问函数内部的数据。所以,为了能访问到函数内部的数据,闭包产生了。
闭包的定义: 是指有权访问另一个函数作用域中的变量的函数。
这么说有点晦涩,按我的理解,闭包就是一个能在外部访问其他函数的局部变量的函数。
闭包的产生条件:
1、嵌套函数
2、内部函数引用外部函数的变量
闭包实例:
function fn() {
var num=10;
function fun() {
var res=++num
console.log(res); // 11
}
// 在函数内部将函数返回,形成闭包
return fun();
}
fn();
闭包的this
this是在函数运行时才确定的,谁调用this就指向谁。如果在全局范围中,就是window,如果在对象中,就指向这个对象。
闭包的作用:
1、能延长局部变量的生命周期,即在函数执行完毕后,不会立马被回收,还会存活在内存中。(只有当嵌套的内部函数成为垃圾对象时,闭包死亡。)
2、能在外部直接读取到内部函数的数据。
3、保护函数内的变量安全,实现封装,防止与其他环境发生命名冲突。
闭包的应用
可用于定义js模块,将所有的数据和功能封装在一个内部函数,只向外暴露一个方法的对象或函数。模块的使用者只需要通过暴露的对象调用方法来实现对应功能。