js函数闭包
函数闭包:内部函数可以访问定义他们外部函数的参数和变量。作用域链的向上查找,把外围的作用域中的变量值存储在内存中而不是在函数调用完毕后销毁,设计私有的方法和变量,避免全局变量的污染。闭包简单来说就是一个函数访问了它的外部变量。
1 var quo = function(status){ 2 return { 3 getStatus: function(){ 4 return status; 5 } 6 } 7 }
status保存在quo中,它返回了一个对象,这个对象里的方法getStatus引用了这个status变量,即getStatus函数访问它的外部变量status;
1 1 var newValue = quo('string');//返回了一个匿名对象,被newValue引用着 2 2 newValue.getStatus();//访问到了quo的内部变量status
假如并没有getStatus这个方法,那么quo('sting')结束后,status自动被回收,正是因为返回的匿名对象被一个全局对象引用,那么这个匿名对象又依赖于status,所以会阻止status的释放。1 //错误方案 2 var test = function(nodes){ 3 var i ; 4 for(i = 0;i){ 5 nodes[i].onclick = function(e){ 6 alert(i); 7 } 8 } 9 }
匿名函数创建了一个闭包,那么其访问的i是外部test函数中的i,所以每一个节点实际上引用的是同一个i。
1 //改进方案 2 var test = function(nodes){ 3 var i ; 4 for(i = 0;i){ 5 nodes[i].onclick = function(i){ 6 return function(){ 7 alert(i); 8 }; 9 }(i); 10 } 11 }
每一个节点绑定了一个事件,这个事件接收一个参数,并且立即运行,传入i,因为是按值传递的,所以每一次循环都会为当前i产生一个新的备份。