1.什么是闭包?
一个函数嵌套另一个函数,内部函数引用了外部函数的变量,并且当外部函数调用的时候就形成了闭包。
function fn (){
var a = 1;
function fn1(){
console.log(a)
}
return fn1;
}
var f = fn();
f()
//或者
function fn () {
var a = 1;
return function(){
console.log(a)
}
}
var f = fn();
f()
//或者
function show (msg,time) {
setTimeout(function(){
console.log(msg)
},time)
}
show("closure",2000)
我们可以使用谷歌的调试工具,debug查看一下
2.闭包的作用
(1)使函数内部的变量在函数执行完后没有消失,仍然存活在内存中,延长了局部变量的生命周期。在一个正常的函数内部,声明一个变量,当这个函数执行完之后,内部的变量就会消失。
(2)让函数外部可以操作(读写)到函数内部的数据(变量、函数)
3.闭包的生命周期
function fn(){
var a = 1;
function fn2(){
a++;
console.log(a)
}
return fn2
}
var f = fn()
f();
f();
f = null;
在上面a++的这个例子当中,闭包是在fn2定义的时候就形成(不是在调用fn2)
那闭包在什么时候死亡呢,当变量f赋值为null的时候,切断了f指向内存中的联系,也就是地址值,成为了垃圾对象。
4.闭包的应用
定义js模块
具有特定功能的js文件
数据和功能都封装在一个函数内部(私有的)
向外暴露一个对象或者函数,然后可以在外部调用
//第一种方式
(function(window){
var msg ="i am msg"
function doUp(){
console.log("doUp "+msg.toUpperCase())
}
function doLower(){
console.log("doLower " +msg.toLowerCase())
}
//暴露方法
window.module={
doUp:doUp,
doLower:doLower
}
})(window)
//调用函数内部的方法
module.doUp() // doUp I AM MSG
module.doLower() // doLower i am msg
//第二种方式
function module (){
var msg ="i am msg"
function doUp(){
console.log("doUp "+msg.toUpperCase())
}
function doLower(){
console.log("doLower " +msg.toLowerCase())
}
return {
doUp:doUp,
doLower:doLower
}
}
var f = module()
f.doUp()
f.doLower()
组成部分:
1.自调用的匿名函数
2.内部有数据 方法 还有向外暴露的对象
3.通过对象来调用
4.为什么自调用的匿名函数要传window这参数呢,不传window程序也是可以运行的,传了window是为了代码压缩。
5.推荐第一种方式
这篇写的能明白吗?哪里不明白,留言看到修改。。。