Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可以为编程数据获取提供简巧快捷的方式,缺点是占用内存时间过长,容易造成内存泄漏,影响性能。下面是我总结的闭包常见的三种用法:
一 模仿块级作用域
(function(){ var a=1; var i=0; var temps=[]; while(i<10){ temps[i]=a+i; a=a+i; i++; } console.log(temps); //[1, 2, 4, 7, 11, 16, 22, 29, 37, 46] })(); console.log(i); //undefined
二 函数作为参数传进作为内部函数使用:
function func1(str){ var strTotal=str+" loves"+" "; return strTotal; } function func2(fn,str2){ var str="Johnharvy"; return func1(str)+str2; } console.log(func2(func1,"LouJia xing!")); //Johnharvy loves LouJia xing!
三 返回内部函数,返回的函数中存有外部函数的活动对象:
function func3(){ var str="Johnharvy"; function func4(str2){ return str+" "+"loves"+" "+str2; } return func4; } console.log(func3()("LouJia xing!")); //Johnharvy loves LouJia xing!
这里再证明一下函数的参数也是可以被内部函数保存的:
function func5(str){ function func6(){ alert(str); } return func6; } func5("Hai!")();//Hai