想要理解闭包。首先得了解JavaScript中的三个东西。
1,函数内部可以访问的范围。
就是说,函数内部能访问,自身内部以及自身外层的变量。(这个很好理解,大部分语言都是如此)
如:
var a = 1;
function myF(){
//这里可以访问a
}
函数f1内部有函数f2的话。
var a = 1;
function f1{
var b = 2;
function f2(){
//这里可以访问a和b
}
}
2,函数自我调用
函数在定义的同时调用自我一次,对外界不可见。外界不能再调用它了。
(funciton(){
//要运行的代码
})();
// 带参数的自我调用函数
(function(a,b){
//...
})(1,2)
3,JavaScript中,函数Funciton也是对象Object,可以作为返回值
function f1(){
return f2(){};
}
var a = f1();//这样a就等于函数f1的返回值即函数f2了
//我们要运行函数f2,就可以这样:
a();
综上所述,我们想要一个变量,这个变量不能直接被访问,只能通过特定函数访问到。(有点类似于Java自私变量,只能通过get/set方法访问)。
我就需要一个自调用函数,在这个自调用函数中声明(以及初始化)这个变量x。然后再在这个自调用函数中返回一个处理变量x的函数(简称f2吧)。把自调用函数返回的函数f2返回给变量a。然后就可以通过a(),一直调用函数f2,而函数f2作为自调用函数的内部函数,可以一直访问处理自调用函数的变量x。这就是所谓的闭包。
var a = (function(){
var x = 0;
return function (){
return x += 1;
}
})();
a(); // 返回1
a(); // 返回2
a(); // 返回3
闭包是一种保护私有变量的机制。防止外界通过赋值直接去更改他或者覆盖他。