闭包,百度的解释为“闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)”。
闭包是JavaScript学习者的成年礼,没理解闭包就不能说自己学会了JavaScript。闭包在编程中用的比较多,有时候自己在想,为什么需要闭包,闭包又是怎么产生的。
在JavaScript中函数是一等公民,函数的返回对象可以是简单类型也可以是函数,简单类型对外部依赖最少,但是函数除了定义函数内的变量以及逻辑操作还包含外部环境变量(上下文),为了使返回的函数是一个完整的功能块,势必要求函数所依赖的外部环境也一同提供。返回函数的外部依赖像是必须的配套支持,缺少外部依赖的函数是不完整的,也就无法提供正常的函数功能。由于函数每次运行都要进行一次完整全新的资源分配,因此返回的各闭包函数都拥有自己完整独立的一套外部环境(上下文),对外表象好像是类的不同实例,实例都拥有自己的私有变量。
var F=function(){ var i=0; return { add:function(){ i++; }, display:function(){ console.log(i); } } }
测试如下:
var f1=F(); f1.add(); f1.add(); f1.display();//2 var f2=F() f2.add(); f2.display();//1
由此测试可看出f1,f2拥有各自的i变量。