js闭包
闭包是js的一个特点,也是一个难(坑)点。我也研究闭包研究了一段时间,也有了一点收获,下面把我的收获分享给一下。
了解闭包前我们需要搞清楚变量作用域,就是全局变量和局部变量。
js中任何函数可以访问全局变量,但是局部变量除了访问自己内部的局部变量和自己上级的局部变量之外无法访问别的函数的局部变量。
function foo(){ var i=2; var n=3; var m=4; } function fun(){ alert(i,n,m); } fun(); //undefind,undefind,undefind
然而在开发当中我们往往需要访问别的函数的局部变量这改怎么办?
那就是函数里面写函数,这样里面的函数可以访问外面的函数的全部变量,而外面的函数访问不了里面函数的变量(这就是传说中的作用域链)
var par = parent(); par(); //12 function parent(){ var i=2; var n=3; var m=4; return function(){ i++; n++; m++; console.log(i+n+m); } }
然而这个parent函数里面的匿名函数就是传说中的闭包。
到这里看出来闭包其实就是能够访问其他函数局部变量的函数。
我这里写的例子有好几个变量i,n,m。为什么呢?因为之前拿一个变量写的例子有人质疑过用return不是可以得到?
确实一个变量的时候可以renturn出去,但是变量多了呢?
又有人说直接在parent函数中写对变量的操作,可以不用这么麻烦。
我把函数的调用放在前面是为了说明这个闭包可以在别的地方调用。
有一种情况就是参数只能在parent函数里面拿到,而这参数不能立即调用,需要在某个特定场合调用,这个时候就不能在parent函数中直接写对变量的操作了,最好的方法就是闭包。