简单的闭包示例
function f1(){
var a=1;
function f2(){
console.log(a)
}
f2()
}
f1()
其实闭包看起来就像是直接返回一个值而已,那这样的话,为什么不直接写成下面这样 还更简单
function f1(){
var a=1;
return a;
}
console.log(f1())
对吧,看结果不都是一样的?不就是返回了个值么,那明显第二种更简单啊
但是 第二种里边的变量a并不能长久保存,只有在调用这个函数的时候才会生成这个变量,想长久保存的话就定义成全局变量,但全局变量定义太多会造成变量污染,并且,你定义的这些全局变量可能会跟别人的重名,那么到时候代码运行,会调用的是哪一个就不好说了,当你引用第三方的代码时,说不定就重名了,而且,全局变量的命名规范也是个问题
闭包可以长久保存局部变量又不会造成全局污染
代码示例
function f1(){
var i=1;
i++;
return i;
}
console.log(f1());
console.log(f1());
console.log(f1());
多次调用 f1() ,你会发现其实打印的结果一直都是2
而这,就是因为普通的函数的局部变量只会在调用时创建,调用完毕后就被销毁了
而闭包则不同
闭包代码示例
function f1(){
var i=1;
function f2(){
i++
console.log(i)
}
return f2;
}
var f=f1()
f();
f();
f();
像这个代码就可以实现 i 的累加
但需要注意的是,其实闭包是需要一个对象来接收它的返回值的,说到底跟全局对象其实还是很像的,就只是换了个方式,用全局对象来保存一个值,不信你看下面这个例子
function f1(){
var i=1;
function f2(){
i++
console.log(i)
}
return f2;
}
f1()()
f1()()
f1()()
是不是发现这个其实还是一直打印的2
那就对了,因为没有一个变量接收闭包的返回值,所以它的值一直被后面的f1()()所刷新