想要理解闭包。首先得了解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闭包是一种保护私有变量的机制。防止外界通过赋值直接去更改他或者覆盖他。