js闭包
啥是闭包?
闭包是能读取其他函数内部变量的函数,js中能读取一个函数内部变量的只有该函数的后代函数,在函数的外部是访问不了函数的变量的.
需要操作某个函数的内部变量时,不能把所有的操作都放在函数内部,这样就需要内部函数作为一个桥梁,将函数的信息输送出来
注意一点,在函数内部声明变量时必须要使用var,否则系统会认为你声明的是一个全局变量
声明变量时,如果不写var,系统会认为声明的是window.a,即window对象的属性
闭包有啥用?
1.可以防止全局的命名空间被污染
--如果要写一个累加器,不使用闭包的话,就必须定义一个全局的变量来接收
var count = 0; function add(){ count++; console.log(count); }
//每次调用add函数count就会加1 add(); add(); add();
//这个函数如果count变量放在函数内部,每次调用函数时count都会被重置为0,不能达到累加的作用
//如果使用闭包就不会出现这一问题
2.便于模块化开发
使用闭包开发的项目各个功能都被封装到了各自的函数中,之间互不影响
3.安全性
将变量都变为私有的,只有通过内部函数才能访问函数的变量,能够提高成程序的安全性
闭包咋写啊?
上面的例子如果写成闭包的形式就是这样:
function add(){ var count = 0; function inner(){ count++; console.log(count); } return inner;
//将内部函数作为返回值返回 } var outer = add();//定义一个变量接收add函数的返回值 outer(); outer(); outer();
//在函数外add函数外直接访问count变量是不可能的,但是通过闭包就可以实现
闭包经常与for循环和匿名自调用函数结合:
<!DOCTYPE html> <html> <head> <title>模拟一个非诚勿扰的场景</title> <script type="text/javascript"> window.onload = function(){ var btn = document.querySelectorAll('.choiceArea>button'); function demo(){ for(var i=0;i<btn.length;i++){ //每次循环都将i作为一个参数赋值给j (function(j){ btn[j].onclick =function(){ alert("你的的选择是"+(j+1)+"号女嘉宾"); } }(i)); }; } demo(); } </script> </head> <body> 请选择你的心动女生:<br /> <form class="choiceArea"> <button>1号女嘉宾</button> <button>2号女嘉宾</button> <button>3号女嘉宾</button> <button>4号女嘉宾</button> <button>5号女嘉宾</button> </form> </body> </html>
闭包的缺点
正常函数执行结束之后会立即销毁,而闭包因为存在引用会一直存在在内存中,如果闭包过多就会在内存中占用大量资源,影响程序的性能.