闭包:
理解js中的闭包,首先理解JavaScript中的作用域以及作用域链的问题
当一个函数嵌套另外一个函数,外部函数将嵌套函数对象作为返回值返回的时候,把这种情况成为闭包
eg:
function fun1(){
var a=100; //声明局部变量 a
function fun2(){ //嵌套函数,在作用域里
console.log(a)
}
return fun2 //调用嵌套函数fun2,并将fun2的执行结果返回
}
var fun=fun1();
fun() //输出结果:100
fun() //输出结果:100
函数fun()声明了一个局部变量,并定义了一个函数fun2,最后将函数的执行结果返回,输出值1
eg:
function fun1(){
var a=100; //声明局部变量 a
function fun2(){ //嵌套函数,在作用域里
a++;
console.log(a);
}
return fun2 //调用嵌套函数fun2,并将fun2的执行结果返回
}
var fn1=fun1();
var fn2=fun1();
fn1() //输出结果:101
fn1() //输出结果:102
fn2() //输出结果:101
fn2() //输出结果:102
现在函数fn1仅仅返回函数内嵌套的一个函数对象,而不是直接返回结果,在定义函数作用域的外面调用函数,由于这个函数作用域链式在函数定义的时候就以及创建的,嵌套的函数在定义在这个作用域链里,并且变量a又是局部变量,不管在何时何地执行函数,这种绑定依然有效。因此,局部变量会一直保存下来。
闭包实现
当一个函数创建后,它保存了一个作用域链,并且作用域链会被函数中的作用域可访问的对象num填充