闭包
闭包(what-是什么,How-怎么用,优缺)
What:能够读取其他函数内部变量的函数(函数中的函数)
How:读取函数内部变量;让这些变量的值始终保存在内存中(有点让这个值变成一个私有变量,只有闭包可以用得到并且执行闭包函数时这个值始终不变)
优:How
缺:内存泄漏
注:闭包中返回的函数不要引用循环变量,或者后续会发生变化的变量,因为最终内存内保存的是循环结束后最后的一个值作为闭包内的变量值,在闭包还没执行前,内部的值是没有被赋予的
例:外面面试经常考这种
var arr = [ ];
function test(){
for(var i=0;i<5;i++;){
arr[i] = function(){
retrun i;
}
}
return arr;
}
test(); //执行之后返回的是arr这个数组
console.log(arr[1]); //输出的是arr[1],其实这时输出的正是闭包函数function(){ retrun i;}
console.log(arr[1]()); //输出5
理解:闭包函数function(){ retrun i;}在整个for循环中一直只是在赋值给arr,但是一直都没有执行,因此这个i并没有被传入闭包函数中,直到执行console.log(arr[1]()); 的时候,闭包函数被执行,这时闭包函数内的i用的是test函数中for循环结束后最终i++得到的5,作为私有变量保存于内存中,因此,怎么执行闭包,输出的都是i=5
其实理解起来我觉得挺拗口的,自己也是半迷糊半了解,先记下来,以后发现问题再优化好了。
参考自阮一峰:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html