闭包是指词法表示包括不必计算的变量的函数,闭包函数能够使用函数外定义的变量.
闭包结构有以喜爱盎格比较鲜明的特性:
(1)封闭性
外界无法访问闭包内部的数据,如果在比包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口.
(2)持久性
对于一般函数来说,在调用完毕后,系统会自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保持存在系统中,闭包中的数据依然存在,从而实现对数据的持久使用.
下面以一个经典的闭包示例来演示:
function f(x){ //外部函数 var a = x; //外部函数的局部变量,传参 var b = function(){ //内部函数 return a //访问外部函数中的局部变量 } a++; //访问后,动态更新外部函数的变量 return b //内部函数 } var c = f(5) //调用外部函数,并赋值 console.log(c()); //6 调用内部函数,返回外部函数更新后得值6
如果没有闭包函数的作用,那怎么种种数据寄存和传递就无法得以实现,例如
function f(x){ var a = x; var b = a; //直接把局部变量的值传递给局部变量b a++ return b; //局部变量b } var c = f(5) console.log(c); //5
闭包在程序开发中具有重要的价值.例如:使用闭包结构能够跟踪动态环境中数据的实时变化,并即时存储.
function f(){ var a = 1; var b = function(){ return a } a++ return b } var c = f() console.log(c()); //返回2,而不是1
上面示例,闭包中变量b存储的值并不是对上面行变量a的值的简单复制,继续以用外部函数定义的局部变量中的值,直到外部函数f调用返回.闭包不会因为函数环境的注销而消失,会始终存在.